一、 启动容器
docker run 可以启动容器,进入到容器,并随机生成容器ID和名称
1. 命令语法
docker run [选项] [镜像名] [shell命令] [参数]
| 常用选项 | 作用 |
|---|---|
| -i | 以交互模式运行容器,与-t一起使用 |
| -t | 为容器重新分配一个伪输入终端,与-i一起使用 |
| -d | 后台运行容器,并返回容器ID |
| --name 容器名称 | 给容器取名 |
| -h 名称 | 指定容器的hostname |
| -P(大写) | 随机端口映射,容器内部端口 随机 映射到主机的端口 |
| -p(小写) | 指定端口映射,格式为:主机(宿主)端口:容器端口 |
2. 后台启动容器
可以使用 -d 选项后台启动容器
[root@localhost ~]# docker run -d nginx
b83c93907887044cb19de25b7d80e63c5ed226e0c34e330bfc3068666a68d218
3. 设置容器退出后启动规则
| 规则 | 说明 |
|---|---|
| no | 默认为否,退出时不自动重启容器 |
| on-failure[:max-retries] | 仅当容器以非零退出状态退出时才重新启动。可以选择限制Docker守护进程尝试重新启动的次数 |
| always | 无论退出状态如何,始终重新启动容器。当您指定always时,Docker守护进程将尝试无限期地重新启动容器。容器也总是在守护进程启动时启动,而不管容器的当前状态如何 |
| unless-stopped | 无论退出状态如何,始终重新启动容器,但是如果容器之前已处于停止状态,则不要在守护进程启动时启动它 |
示例:
[root@localhost ~]#docker run -d --restart always httpd
4. 启动容器执行一次性的命令
系统类的容器,启动后没有执行任何操作,不像 httpd nginx需要持续向外提供服务, 所以系统类的容器默认是一次性的容器启动就退出
[root@localhost ~]# docker run centos:7 echo "hello world"
hello world
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f604ddde5bd7 centos:7 "echo 'hello world'" 6 seconds ago Exited (0) 6 seconds ago relaxed_chatterjee
5. 使用命令将系统类容器持续运行
使用 docker run -it
[root@localhost ~]# docker run -it centos:7 bash
[root@localhost ~]# docker run -it centos:7 tail -f /etc/passwd
6. 退出容器
exit如果直接使用 exit 那么容器也将停止
[root@localhost ~]# docker run -it centos:7 bash
[root@c2cbc2849b9c /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c2cbc2849b9c centos:7 "bash" 11 seconds ago Exited (0) 5 seconds ago priceless_montalcini
ctrl+p+q同时按三个键ctrl+p+q ,容器依然存在
[root@localhost ~]# docker run -it centos:7 bash
[root@d07d0f31390a /]# //同时按三个键ctrl+p+q
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d07d0f31390a centos:7 "bash" About a minute ago Up About a minute hungry_bhaskara
7. 启动容器时指定名称
容器在启动的时候都会被分配到一个随机id和一个随机名字,也可以使用--name 名称自定义设置名字,注意每个容器的名称要唯一。
[root@localhost ~]# docker run --name n1 nginx
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3866328c92bd nginx "/docker-entrypoint.…" 19 seconds ago Exited (0) 12 seconds ago n1
8. 设置容器内的名称
可以使用-h 名称自定义hostname
[root@localhost ~]# docker run -it -h 7-1 centos:7 bash
[root@7-1 /]#
二、 查看容器状态
1. 显示当前存在容器
使用命令 docker ps [OPTIONS]
| 命令 | 作用 |
|---|---|
| docker ps | 查看当前运行状态的容器 |
| docker ps -a | 查看所有容器的状态 包括退出的和运行的 |
| docker ps -q | 只显示运行状态的容器的ID (-aq 显示所有状态的容器的ID) |
| docker ps -s | 查看容器的大小 (-as 显示所有容器的大小) |
| docker ps -l | 查看最近的一个容器状态 |
| docker ps -n 数字 | 列出最近创建的n个容器 |
| docker ps -f | 根据条件过滤显示的内容 |
挑选状态:
[root@localhost ~]# docker ps -f status=exited //退出状态
[root@localhost ~]# docker ps -f status=running //运行状态
2. 查看容器内的进程
使用命令 docker top CONTAINER [ps OPTIONS]
[root@localhost ~]# docker run -d --name n1 nginx //启动一个容器,取名为 n1
3162bc2996890fd52c281d58e509f7fc63ce4ae21f5dc0542f093e3be38b3129
[root@localhost ~]# docker top n1 //查看 n1 容器中的进程状态
3. 查看容器资源使用情况
使用命令 docker stats [OPTIONS] [CONTAINER...]进行查看(类似 top 会一直动态刷新)
[root@localhost ~]# docker stats //查看所有容器资源使用情况
[root@localhost ~]# docker stats n1 //查看单个容器,可以跟容器id或容器名字
[root@localhost ~]# docker stats --no-stream //查看所有,并且只运行一次
[root@localhost ~]# docker stats --no-stream n1 //查看n1,并且只运行一次
4. 查看容器的详细信息
使用命令 docker inspect [OPTIONS] NAME|ID [NAME|ID...]
docker inspect 可以查看docker各种对象的详细信息,包括:镜像,容器,网络等
[root@localhost ~]# docker inspect n1
`选择性查看`
[root@localhost ~]# docker inspect -f {{.State.Status}} n1
running
[root@localhost ~]# docker inspect -f {{.NetworkSettings.IPAddress}} n1
172.17.0.3
//-f 通过Go模板来格式化输出容器的信息
5. 查看容器的日志
使用命令 docker logs [OPTIONS] CONTAINER可以查看容器中运行的进程在控制台输出的日志信息
[root@localhost ~]# docker logs n1 //查看n1容器的日志
docker logs -f 容器id //实时追踪
三、 删除容器
docker rm 可以删除容器,即使容器正在运行当中,也可以被强制删除掉
[root@localhost ~]# docker rm -f n1 n2 //可以根据名字删除
[root@localhost ~]# docker rm -f c2cbc2849b9c //也可以根据id进行删除
[root@localhost ~]# docker rm -f 60 //id可以缩写
`删除退出状态的容器`
docker ps -qf status=exited |xargs -n1 docker rm
//xargs 是一个用于从标准输入读取数据,并将这些数据作为参数传递给另一个命令的工具。-n1 参数指定每次从输入中读取一个参数(即一个容器的ID)
四、 容器开启停止
docker start|stop|restart|pause|unpause 容器ID
五、 进入容器
1. attach
docker attach 容器名,attach 类似于vnc,操作会在同一个容器的多个会话界面同步显示,所有使用此方式进入容器的操作都是同步显示的,且使用exit退出后容器自动关闭,不推荐使用,需要进入到有shell环境的容器。
2. exec
在运行中的容器启动新进程,可以执行单次命令,以及进入容器测试环境使用此方式,使用exit退出,但容器还在运行,此为推荐方式。
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
常用选项:
-d, --detach Detached mode: run command in the background
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
常见用法:docker exec -it 容器ID sh|bash
- 一次性操作
[root@localhost ~]# docker run -it --name c1 centos:7 bash
[root@240ad6b13bb0 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
240ad6b13bb0 centos:7 "bash" 9 seconds ago Exited (0) 6 seconds ago c1
- 持久操作
[root@localhost ~]# docker run -itd --name c2 centos:7
65f6f186530446e9516015af3c70d6d26e0226135ee05c62934289a6a1b673ea
[root@localhost ~]# docker exec -it c2 bash
[root@65f6f1865304 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65f6f1865304 centos:7 "/bin/bash" 24 seconds ago Up 23 seconds c2
六、 暴露容器的端口
docker port CONTAINER [PRIVATE_PORT[/PROTO]] 可以查看容器的端口映射关系
1. 暴露随机端口
容器启动后,默认处于预定义的NAT网络中,所以外部网络的主机无法直接访问容器中网络服务 docker run -P 可以将事先容器预定义的所有端口映射宿主机的网卡的随机端口,默认从32768开始使用随机端口 时,当停止容器后再启动可能会导致端口发生变化。
[root@localhost ~]# docker run -d -P --name n1 nginx //启动进程并暴露端口
d5b7da32fdf8ddce3c26523c7239bb2920e0abee29386a1c52a892e81f07f579
[root@localhost ~]# docker port n1
80/tcp -> 0.0.0.0:32768
80/tcp -> [::]:32768
2. 指定端口映射
docker run -p 主机(宿主)端口:容器端口 可以将容器的预定义的指定端口映射到宿主机的相应端口
注意: 多个容器映射到宿主机的端口不能冲突,但容器内使用的端口可以相同
[root@localhost ~]# docker run -d -p 9527:80 --name n2 nginx //将容器的80端口映射成宿主机的9527端口
6a712ff21957848e403fa7b0df7b854a8847c1efaca3f17f0b36f8e5d82d5f67
[root@localhost ~]# docker port n2
80/tcp -> 0.0.0.0:9527
80/tcp -> [::]:9527
如何在不删除容器的情况下,修改已经创建的容器的端口映射关系? 停止docker程序,改json文件。
七、 容器内部的hosts文件
容器会自动将容器的ID加入自己的 /etc/hosts 文件中,并解析成容器的IP
- 一次性查看主机名
[root@localhost ~]# docker run --rm alpine cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 10f5f65c07f3
- 进入到容器中 查看主机名
[root@localhost ~]# docker run -d alpine tail -f /etc/hosts //运行容器
c5e23fa9a42e11c21672ab63d2aa0069572091931daa89982a07edb9f4a7a9d7
[root@localhost ~]# docker exec -it c5e23 sh //进入容器
/ # cat /etc/hosts //查看主机名
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 c5e23fa9a42e
- 人为的修改hosts文件,
--add-host添加指定信息
[root@localhost ~]# docker run -it --rm --name a1 --add-host www.kgc.com:6.6.6.6 --add-host www.accp.com:9.9.9.9 alpine
/ # cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
6.6.6.6 www.kgc.com
9.9.9.9 www.accp.com
172.17.0.4 27f4b5783cc2
八、 指定DNS
容器的dns服务器,默认采用宿主机的dns地址,可以在容器启动时加选项 --dns=x.x.x.x指定其它的DNS地址,也可以在 /etc/docker/daemon.json 文件中进行指定。
[root@localhost ~]# docker run -it --rm --dns 1.1.1.1 --dns 2.2.2.2 centos:7 bash //指定容器的dns
[root@de9b5c2a47f0 /]# cat /etc/resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.
nameserver 1.1.1.1
nameserver 2.2.2.2
# Based on host file: '/etc/resolv.conf' (legacy)
# Overrides: [nameservers]
九、 容器内和宿主机之间复制文件
使用命令 docker cp
docker cp 容器id:要复制的文件 容器中的文件夹 //将容器中的文件拷贝到本地
docker cp 容器中的文件夹 容器id:要复制的文件 //将本地文件拷贝到容器中
- 将容器中的文件传给真机
docker cp 容器id:要复制的文件 容器中的文件夹
准备一个a.txt文件
[root@localhost ~]# docker run -it --name c1 centos:7 bash
[root@38a80de2f1df /]# echo aaa > a.txt
再新打开一个终端执行 docker cp 命令
[root@localhost ~]# docker cp 38:/a.txt /opt/ //将容器中a.txt的文件传给真机
Successfully copied 2.05kB to /opt/
[root@localhost ~]# ls /opt
a.txt containerd rh
- 将真机中的文件传给容器
docker cp 容器中的文件夹 容器id:要复制的文件
[root@localhost ~]# docker cp /etc/passwd 38:/ //将真机的/etc/passwd文件传给容器
Successfully copied 4.1kB to 38:/
[root@38a80de2f1df /]# ls
a.txt anaconda-post.log bin dev etc home lib lib64 media mnt opt passwd proc root run sbin srv sys tmp usr var
十、 容器传递参数
有些容器运行时,需要传递变量,可以使用 -e <参数> 或 --env-file <参数文件> 实现
命令总结
| 命令 | 作用 |
|---|---|
| docker ps | 运行状态的容器信息 |
| docker ps -a | 查看所有容器 |
| docker ps -aq | 只看容器的id |
| docker create | 建立容器 |
| docker start | 开启容器 |
| docker stop | 停止容器 |
| docker run | 运行镜像 先去本地找镜像,没有就去网上仓库拉取,拉取后建立容器 |
| -i 人机交互 | |
| -t 分配一个终端 | |
| -d 后台启动 | |
| --rm 一次性的容器,退出就删除 (测试时使用) | |
| --name 容器设置一个名称 | |
| -P 随机暴露端口,镜像中要事先知道什么端口提供服务 | |
| -p 指定暴露的端口80:80 ,前面是真机的80,后面的80是容器的80 | |
| --restart always 一旦容器意外退出,会自动启动容器,有四个规则默认是no,容器停止不自动启动 | |
| --dns ip地址 #在建立容器的时候设置dns服务器 | |
| --add-host 域名 ip地址 #在/etc/hosts文件中加入dns解析 | |
| -e 传递参数 | |
| docker cp | 真机和容器之间 复制文件 |
| docker rm -f | 强制删除容器 |
| docker exec -it 容器名字/id sh | 进入容器 |
| docker top 容器名/id | 查看容器中的进程 |
| docker stats 容器名/id | 查看容器资源使用情况 |
| --no-stream 只运行一次 | |
| docker logs 容器名/id | 查看容器日志 |