安装
官方文档
Docker提供了以下Linux发行版和体系结构中的.deb和.rpm软件包:
这里我们以centos为例(新版Docker已不支持centos 7以下的版本,所以centos 6.x 慎用
):
-
卸载旧版
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
设置仓库
# 安装需要的工具 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 # 设置docker仓库 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
-
安装docker
sudo yum install docker-ce docker-ce-cli containerd.io
Docker的使用
Docker技术的核心是image
、container
、network
和volume
旧版的docker客户端的命令一般是
docker command
的方式的,新版的Docker为了更好的区分不同模块的命令,可以支持类似docker image ls
这样的命令(docker module command
)。
Docker 镜像(image
)
镜像是创建容器的只读模板
指令 | 描述 |
---|---|
ls | 列出镜像 |
build | 构建镜像来自Dockerfile |
history | 查看镜像历史 |
inspect | 显示一个或多个镜像详细信息 |
pull | 从镜像仓库拉取镜像 |
push | 推送一个镜像到镜像仓库 |
rm | 移除一个或多个镜像 |
prune | 移除未使用的镜像。没有被标记或被任何容器引用的。 |
tag | 创建一个引用源镜像标记目标镜像 |
export | 导出容器文件系统到tar归档文件 |
import | 导入容器文件系统tar归档文件创建镜像 |
save | 保存一个或多个镜像到一个tar归档文件 |
load | 加载镜像来自tar归档或标准输入 |
[root@cloudfile ~]# docker image -h
Flag shorthand -h has been deprecated, please use --help
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Display detailed information on one or more images
load Load an image from a tar archive or STDIN
ls List images
prune Remove unused images
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rm Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
Run 'docker image COMMAND --help' for more information on a command.
[root@cloudfile ~]#
示例:拉取nginx镜像
[root@cloudfile ~]# docker image ls #查看本地已有的镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 9.6 6782500d4eb1 2 weeks ago 200MB
kong latest 7a800e1cef72 3 weeks ago 185MB
[root@cloudfile ~]# docker pull nginx # 可以省略images, 默认拉取最新版本,指定版本可以在镜像名后面添加版本号,例如 docker pull nginx:1.14
Using default tag: latest
latest: Pulling from library/nginx
afb6ec6fdc1c: Pull complete
b90c53a0b692: Pull complete
11fa52a0fdc0: Pull complete
Digest: sha256:6fff55753e3b34e36e24e37039ee9eae1fe38a6420d8ae16ef37c92d1eb26699
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
You have new mail in /var/spool/mail/root
[root@cloudfile ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 9.6 6782500d4eb1 2 weeks ago 200MB
nginx latest 9beeba249f3e 2 weeks ago 127MB
kong latest 7a800e1cef72 3 weeks ago 185MB
[root@cloudfile ~]#
Docker 容器(container
)
创建容器
Docker 使用 run+image name 命令来创建容器,创建一个容器的时候可以附加许多指令来设置很多条件
设置相关指令
指令 | 描述 |
---|---|
-i, --interactive | 交互式 |
-t, --tty | 分配一个伪终端 |
-d, --detach | 运行容器到后台 |
-a, --attach list | 附加到运行的容器 |
--dns list | 设置DNS服务器 |
-e, --env list | 设置环境变量 |
--env-file list | 从文件读取环境变量 |
-p, --publish list | 发布容器端口到主机 |
-P, --publish-all | 发布容器所有EXPOSE的端口到宿主机随机端口 |
-h, --hostname string | 设置容器主机名 |
--ip string | 指定容器IP,只能用于自定义网络 |
--link list | 添加连接到另一个容器 |
--network netwokname | 连接容器到一个网络 |
--mount mount | 挂载宿主机分区到容器 |
-v, --volume list | 挂载宿主机目录到容器 |
--restart string | 容器退出时重启策略,默认no [always|on-failure] |
--add-host list | 添加其他主机到容器中/etc/hosts |
资源限制指令
资源限制指令 | 描述 |
---|---|
-m,--memory | 容器可以使用的最大内存量 |
--memory-swap | 允许交换到磁盘的内存量 |
--memory-swappiness=<0-100> | 容器使用SWAP分区交换的百分比(0-100,默认为-1) |
--memory-reservation | 内存软限制,Docker检测主机容器争用或内存不足时所激活的软限制,使用此选项,值必须设置低于—memory,以使其优先 |
--oom-kill-disable | 当宿主机内存不足时,内核会杀死容器中的进程。建议设置了-memory选项再禁用OOM。如果没有设置,主机可能会耗尽内存 |
--cpus | 限制容器可以使用多少可用的CPU资源 |
--cpuset-cpus | 限制容器可以使用特定的CPU |
--cpu-shares | 此值设置为大于或小于默认1024值,以增加或减少容器的权重,并使其可以访问主机CPU周期的更大或更小比例 |
示例:创建一个nginx容器
docker run -tid --name dev-nginx -p 8080:80 nginx
-tid 这里使用了指令连写的方式,使用了t i d这三个指令 表示是交互式的、分配伪终端、运行容器到后台,
--name 将这个容器命名为dev-nginx
-p 8080:80 是将宿主机的8080端口转发到容器的80端口
[root@cloudfile ~]# docker ps #查看运行中的进程
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@cloudfile ~]# docker run -tid --name dev-nginx -p 8080:80 nginx # 创建dev-nginx容器
e0b8a178c45918bb9b0da9fc696690eb99cdb24db4b008381e8a2b1d959fbbf0 #docker引擎分配的容器id
[root@cloudfile ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e0b8a178c459 nginx "nginx -g 'daemon of…" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp dev-nginx
[root@cloudfile ~]#
使用容器
容器创建成功之后,我们就有许多其他的命令可以用来操作这个容器了。
指令 | 描述 |
---|---|
ls | 列出容器 |
inspect | 显示一个或多个容器详细信息 |
attach | 附加本地标准输入,输出和错误到一个运行的容器 |
exec | 在运行容器中执行命令 |
commit | 创建一个新镜像来自一个容器 |
cp | 拷贝文件/文件夹到一个容器 |
logs | 获取一个容器日志 |
port | 列出或指定容器端口映射 |
stats | 显示容器资源使用统计 |
top | 显示一个容器运行的进程 |
update | 更新一个或多个容器配置 |
stop/start | 停止/启动一个或多个容器 |
rm | 删除一个或多个容器 |
容器启动成功之后,Docker引擎会自动分配一个containerId,这个id可以用来唯一标识这个容器,也可以使用通过--name来命名容器作为唯一标识。我们可以使用
docker stop/start/rm ... containerName/prefix4(containerId)
格式来操作容器,其中containerName是容器名称,prefix4(containerId)为containerId至少前4位。
[root@cloudfile ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e0b8a178c459 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:8080->80/tcp dev-nginx
[root@cloudfile ~]# docker stop dev-nginx # 停止dev-nginx
dev-nginx
[root@cloudfile ~]# docker rm dev-nginx # 删除dev-nginx
dev-nginx
[root@cloudfile ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@cloudfile ~]#
-
进入容器
docker exec -it containerId/containerName bash
退出容器的终端
control+p+q
-
查看容器日志
docker log containerId/containerName
-
自动重启
加上 `--restart=always`
Docker 网络(network)
Docker 支持自定义network来提供给容器进行通讯,Docker 内置了一个默认的bridge network,有未指定 network 的容器,默认连接到此 network 中,其网段为
172.17.0.1/16
。所以,两个未进行任何连接操作的容器是可以通过 IP 地址互相通信的,因为他们同在一个 network 下,但通讯只能通过 IP 地址进行(比如ping 172.17.0.5
),不可以通过容器名通信(比如ping container-name
)。但自定义创建的网络可以通过容器名进行通信。
[root@cloudfile ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
Run 'docker network COMMAND --help' for more information on a command.
[root@cloudfile ~]#
可以通过 docker network connect
指令将容器连接到一个 network,也可以在起容器(docker run
指令)时加入 --network
参数指定即将创建的容器加入到哪个 network,还可以通过 docker network disconnect
命令将容器移出自定义的 network。
示例:创建容器连接网络
[root@cloudfile ~]# docker network list # 查看网络节点列表
NETWORK ID NAME DRIVER SCOPE
b0b2ac02a44e bridge bridge local
e6b334287fd0 host host local
73cc4dd0610d none null local
[root@cloudfile ~]# docker network create dev # 添加名为dev的列表
570b83327e2b3cfa53922a1b5f5c223d6f6166ace7069648fb0188295a6d6922
[root@cloudfile ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
b0b2ac02a44e bridge bridge local
570b83327e2b dev bridge local
e6b334287fd0 host host local
73cc4dd0610d none null local
# 创建容器时指定网络
[root@cloudfile ~]# docker run -tid --name dev-nginx-01 -p 8080:80 --network=dev nginx
82c81a5d7ab07a2233e5dc4b74300c661aaef67de7ec7cee98be388c981dfa41
# 先创建容器
[root@cloudfile ~]# docker run -tid --name dev-nginx-02 -p 8081:80 nginx
0408d5b0f61d31d33751512014072d240b5ad25cb05aae57e4aac97071983e2f
# 将容器连接至dev网络
[root@cloudfile ~]# docker network connect dev dev-nginx-02
[root@cloudfile ~]#
Docker 卷(volume
)
Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs。
volumes
:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。bind mounts
:可以存储在宿主机系统的任意位置。tmpfs
:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统。
卷 Volume
当我们创建一个容器的时候,如果没有指定卷,会自动创建一个圈以供容器存储数据,docker的卷默认存储的位置在
/var/lib/docker/volumes
下,我们可以创建一个volume在创建容器的时候绑定,这样能更加方便的管理容器的数据,不过比起mount来说,mount会更加通用一些。
[root@cloudfile ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
[root@cloudfile ~]#
管理卷
-
查看volume
[root@cloudfile volumes]# docker volume list DRIVER VOLUME NAME local c4969d2e6be2f8ffedd12bdb983d6xxxx
-
创建volume
[root@cloudfile volumes]# docker volume create nginx-volume nginx-volume [root@cloudfile volumes]# docker volume list DRIVER VOLUME NAME local c4969d2e6be2f8ffedd12bdb983d6xxxx local nginx-volume [root@cloudfile volumes]#
-
查看volume详情
[root@cloudfile volumes]# docker volume inspect nginx-volume [ { "CreatedAt": "2020-06-01T16:07:20+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data", "Name": "nginx-volume", "Options": {}, "Scope": "local" } ] [root@cloudfile volumes]#
-
删除volume
docker volume rm nginx-volume
指定volume创建容器
两种写法:
- docker run -itd --name=nginx-dev --mount src=nginx-volume,dst=/usr/share/nginx/html nginx
- docker run -itd --name=nginx-dev -v nginx-vol:/usr/share/nginx/html nginx
通过上述命令启动容器之后,我们可以看到
/var/lib/docker/volumes/nginx-volume/_data
生成了些nginx的默认文件,这个时候我们就可以将我们的静态网页放置在这里了。[root@cloudfile _data]# pwd /var/lib/docker/volumes/nginx-volume/_data [root@cloudfile _data]# ls 50x.html index.html [root@cloudfile _data]#
绑定volume的好处不言而喻,多个容器可以共享一个数据卷 比如多个nginx 指定一个html文件夹 这样可以提供高可用。
Bind Mounts
我们知道了可以创建volume,然后绑定到容器中,可以达到数据管理以及数据卷共享的功能。但是为了更加方便管理,我们可以将已有的文件夹绑定到容器中。
- docker run -d -it --name=nginx-dev --mount type=bind,src=/var/www,dst=/usr/share/nginx/html nginx
- docker run -d -it --name=nginx-dev -v /var/www:/usr/share/nginx/html nginx
注意:
- 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
- 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。