什么是docker
docker中的容器:
- lxc --> libcontainer --> runC
OCI&OCF
OCI
开放容器倡议
- 由Linux基金会主导于2015年6月创立
- 旨在围绕容器格式和运行时制定一个开放的工业化标准
- 包含两种规格
- 运行时规范(运行时规范)
- 图像规范(图像规范)
OCF
- 开放容器格式
- runC 是一个 CLI 工具,用于根据 OCI 规范生成和运行容器
- 容器作为 runC 的子进程启动,可以嵌入到各种其他系统中,而无需运行守护程序
- runC 建立在 libcontainer 之上,同样的容器技术为数百万个 Docker 引擎安装提供支持
docker提供了一个专门容纳容器镜像的站点:https://hub.docker.com
docker架构
docker架构
docker镜像与镜像仓库
为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的。
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
docker对象
使用 Docker 时,您正在创建和使用映像、容器、网络、卷、插件和其他对象。
- IMAGES
- 映像是一个只读模板,其中包含有关创建 docker 容器的说明。
- 通常,一个映像基于另一个映像,并具有一些额外的自定义。
- 您可以创建自己的映像,也可以仅使用其他人创建并在注册表中发布的映像。
- CONTAINERS
- 控制器是映像的可运行实例。
- 您可以使用 Docker API 或 CLI 创建、运行、停止、移动或删除容器。
- 可以将容器连接到一个或多个网络,将存储附加到该容器,甚至可以基于其当前状态创建新映像。
安装及使用docker
docker安装
cd /etc/yum.repos.d/
curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
yum -y install docker-ce
docker加速
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
- docker cn
- 中国科技大学加速器
- 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://22aw5slm.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
docker event state
docker常用操作
命令 | 功能 |
---|---|
docker search | 在Docker Hub中搜索图像 |
docker pull | 从注册表中提取图像或存储库 |
docker images | 图像列表 |
docker create | 创建一个新的容器 |
docker start | 启动一个或多个停止的容器 |
docker run | 在新容器中运行命令 |
docker attach | 连接到正在运行的容器 |
docker ps | 容器列表 |
docker logs | 获取容器的日志 |
docker restart | 重新启动容器 |
docker stop | 停止一个或多个正在运行的容器 |
docker kill | 杀死一个或多个正在运行的容器 |
docker rm | 卸下一个或多个容器 |
docker exec | 在正在运行的容器中运行命令 |
docker info | 显示系统范围的信息 |
docker inspect | 返回有关Docker对象的低级信息 |
容器查看命令
docker ps //查看容器运行状态
选项:
-a //显示所有的容器,包括未运行的
-q //只显示容器id
-l // 显示最近创建的容器。
-f // "筛选条件" 根据条件过滤显示的内容
示例:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
257afab0feb3 nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 80/tcp web
CONTAINER ID //容器 ID
IMAGE //使用的镜像
COMMAND //启动容器时运行的命令
CREATED //容器的创建时间
STATUS //容器状态
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS //容器的端口信息和使用的连接类型(tcp\udp)。
NAMES //容器名称
容器详细信息查看命令
docker inspect 容器名 //查看容器详细信息
示例:
[root@localhost ~]# docker inspect web
......略.......
容器创建命令
docker run //从镜像运行一个容器
选项:
--name //指定容器的名称,如果不指定随机给容器生成一个名称
-it //为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端,不建议run时使用
-d //容器以守护进程的方式运行
-p 宿主机端口:容器端口 //将宿主机端口映射给容器端口
-v 宿主机目录:容器目录 //将宿主机目录挂载到容器中;直接写容器目录省略宿主机目录,将在宿主机自动创建一个目录挂载到容器中
--user uid:pid //将宿主机用户和组映射至容器中
-e //启动容器时传递环境及其值
--rm //容器退出时删除容器
--cpuset-cpus CPU序号 //容器能够使用哪些物理cpu
--cpu-shares 数值 //CPU共享权值(相对权重)
--memory 数值 //容器内存限制,单位b,k,m,g
--memory-swap 数值 //容器内存+交换分区大小,不能小-m的值
--restart 策略 //指定容器停止后的重启策略
no //容器退出时不重启
on-failure //容器故障退出(返回值非零)时重启
on-failure:3 //在容器非正常退出时重启容器,最多重启3次
always //容器退出时总是重启
unless-stopped //在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
--network 网络名称 //容器网络设置
bridge //使用桥接模式
host //容器使用主机的网络
container:NAME_or_ID //使用其他容器的网路,共享IP和PORT等网络资源
none //容器使用自己的网络(类似bridge);但是不进行配置,如分配veth pair 和网桥连接,配置IP等
--link 容器名称 //指定容器间的关联,可以和指定容器进行通信
示例:
//使用httpd镜像启动一个名为htt的容器
[root@localhost ~]# docker run --name htt httpd
.....略......
//使用httpd镜像启动一个名htt的容器并分配一个bash shell的终端进入容器
[root@localhost ~]# docker run --name htt -it httpd /bin/bash
root@d6c57307befd:~#
root@d6c57307befd:~# exit
注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行
使用httpd镜像启动一个名为htt的容器并在后台运行
[root@localhost ~]# docker run --name htt -d httpd
f65b0bc6387abe666da51e594683cd15682ebc03a6c957724d8c3afb9c3e2f76
使用httpd镜像启动一个名为htt的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@localhost ~]# docker run --name htt -d -p 8080:80 httpd
15168e620994b369f9b164515d9fb8d0d78da84449439ccc6bedfbecee73668d
[root@localhost ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 [::]:8080 [::]:*
[root@localhost ~]# curl http://192.168.91.134:8080
<html><body><h1>It works!</h1></body></html>
查看所有容器状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
15168e620994 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp htt
257afab0feb3 nginx "/docker-entrypoint.…" 26 minutes ago Up 26 minutes 80/tcp web
容器生命周期管理命令
docker start 容器名 //开启容器
docker stop 容器名 //停止容器
docker kill 容器名 //杀死容器
docker restart 容器名 //重启容器
docker pause 容器名 //暂停容器中所有的进程
docker unpause 容器名 //恢复容器中所有的进程
容器占用资源查看命令
docker stats 容器名 //查看容器使用资源信息
docker top 容器名 //查看容器中运行的进程信息,支持ps命令参数
docker port 容器名 //查看宿主机端口和容器端口之间的端口映射
容器日志查看命令
//当容器创建失败时,因为容器没有启动成功则无法看到错误日志,无法判断问题所在,下面命令可以查看日志,不管容器时候启动成功
docker logs 容器名 //获取容器的日志信息
选项:
-f //跟随打印最新的日志追加在最后面
-t //显示日志打印的时间戳
--tail 数量 //只显示最新的指定数量的几条日志信息
容器内进程连接和命令执行
docker attach 容器名 //连接到正在运行的容器进程中,默认连接到容器启动时启动的进程
示例:
连接到nginx02容器中的http进程,此时可以看到http工作日志
[root@localhost ~]# docker attach htt
192.168.91.134 - - [10/Aug/2022:02:53:06 +0000] "GET / HTTP/1.1" 200 45
注意:使用attach连接到容器容器进程,一旦终止容器内的进程,容器就终止运行
如果容器启动时运行的命令是shell进程,则连接shell终端
[root@localhost ~]# docker attach htt
root@4b34dbaf4881:~#
root@4b34dbaf4881:~# exit
exit
注意:使用attache连接到容器的shell一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行
docker exec 容器名 执行命令 //不进入容器执行容器中的命令
选项:
-d //后台执行,不显示结果
-it //为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端
示例:
[root@localhost ~]# docker exec htt ls
bin
build
cgi-bin
conf
error
htdocs
.......
使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@localhost ~]# docker exec -it htt /bin/bash
root@197f5339eff6:~#
root@197f5339eff6:~# exit
exit
宿主机和容器文件复制命令
docker cp 容器名:容器文件路径 宿主机路径 //将容器中的文件复制到宿主机中
docker cp 宿主机路径 容器名:容器文件路径 //将宿主机中的文件复制到容器中
示例:
//将容器中的httpd配置文件复制到宿主机
[root@localhost ~]# docker cp htt:/usr/local/apache2/conf/httpd.conf /root/
[root@localhost ~]# ls
httpd.conf
容器导出和导入命令
docker export 容器名 > 导出的容器文件名 //容器导出
docker import 导出的容器文件名 镜像:标签 //容器导入,导入之后只会生成镜像
示例:
//将htt容器导出为/tmp/htt-du文件
[root@localhost ~]# docker export htt > /tmp/htt-du
[root@localhost ~]# ls /tmp/
htt-du
将导出的容器导入为镜像,名字叫httpd-du:1
[root@localhost ~]# docker import /tmp/htt-du httpd-du:1
sha256:d692964f8c03f3f6f8f3e2f411c2c546bb51a60a2a76f93747de7ae676bc9445
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd-du 1 d692964f8c03 20 seconds ago 203MB
容器删除命令
docker rm 容器名 //删除容器,无法删除运行状态下的容器
选项:
-f //强制,可以删除运行状态下的容器
示例:
[root@localhost ~]# docker rm htt 删除htt容
htt
[root@localhost ~]# docker rm `docker ps -qa` 批量删除所有容器
e7aec54b9a14
257afab0feb3