常用命令

  1. docker container --help
  2. Usage: docker container COMMAND
  3. Manage containers
  4. Commands:
  5. attach Attach local standard input, output, and error streams to a running container
  6. commit Create a new image from a container's changes
  7. cp Copy files/folders between a container and the local filesystem
  8. create Create a new container
  9. diff Inspect changes to files or directories on a container's filesystem
  10. exec Run a command in a running container
  11. export Export a container's filesystem as a tar archive
  12. inspect Display detailed information on one or more containers
  13. kill Kill one or more running containers
  14. logs Fetch the logs of a container
  15. ls List containers
  16. pause Pause all processes within one or more containers
  17. port List port mappings or a specific mapping for the container
  18. prune Remove all stopped containers
  19. rename Rename a container
  20. restart Restart one or more containers
  21. rm Remove one or more containers
  22. run Run a command in a new container
  23. start Start one or more stopped containers
  24. stats Display a live stream of container(s) resource usage statistics
  25. stop Stop one or more running containers
  26. top Display the running processes of a container
  27. unpause Unpause all processes within one or more containers
  28. update Update configuration of one or more containers
  29. wait Block until one or more containers stop, then print their exit codes
  30. Run 'docker container COMMAND --help' for more information on a command.

启动容器

run

创建并启动一个容器 docker run 命令

  1. docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

OPTIONS说明

命令 说明
-a 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
-d 后台运行容器,并返回容器ID
-i 以交互模式运行容器,通常与 -t 同时使用
-p(小写) 端口映射,格式为:主机(宿主)端口:容器端口
-P(大写) 随机映射一个主机(宿主)的端口到内部容器网络端口
-t 为容器重新分配一个伪输入终端,通常与 -i 同时使用
—name 为容器指定一个名称,—name=”nginx-lb”
—dns 指定容器使用的DNS服务器,默认和宿主一致,—dns 8.8.8.8
-h 指定容器的hostname
-e 设置环境变量
-m 设置容器使用内存最大值
—cpuset 绑定容器到指定CPU运行,cpuset=”0,1,2”
—net 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型,—net=”bridge”
—link 添加链接到另一个容器
—expose 开放一个端口或一组端口
—env-file=[] 从指定文件读入环境变量
—rm 这个参数是说容器退出后随之将其删除。默认情况下,为了排障需 求,退出的容器并不会立即删除,除非手动 docker rm, 我们这里只是随便 执行个命令,看看结果,不需要排障和保留结果,因此使用 —rm 可以避免 浪费空间。

创建一次性容器

  1. $ docker run ubuntu:16.04 echo "baxiang"
  2. baxiang
  3. $ docker ps -a
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. 1b3e189b2e5f ubuntu:16.04 "echo baxiang" 17 seconds ago Exited (0) 16 seconds ago nifty_lichterman

交互型

进入容器内,执行cat 查看本地host信息

  1. $ docker run -i -t ubuntu:18.04 /bin/sh
  2. # cat /etc/hosts
  3. 127.0.0.1 localhost
  4. ::1 localhost ip6-localhost ip6-loopback
  5. fe00::0 ip6-localnet
  6. ff00::0 ip6-mcastprefix
  7. ff02::1 ip6-allnodes
  8. ff02::2 ip6-allrouters
  9. 172.17.0.2 d0cc61b2acd8
  10. #

通过exit退出当前交互式容器

后台运行

执行命令Ctrl+P加速Ctrl+Q的方式让容器成为守护式容器

  1. docker run -i -t ubuntu
  2. root@67ac6333c955:/# [root@izhp3f2wn461rak5gw97qmz ~]# docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 67ac6333c955 ubuntu "/bin/bash" 17 seconds ago Up 16 seconds awesome_goldstine

将守护式进程从后台再次进入前台交互执行docker attach

  1. docker run -i -t ubuntu
  2. root@67ac6333c955:/# [root@izhp3f2wn461rak5gw97qmz ~]# docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 67ac6333c955 ubuntu "/bin/bash" 17 seconds ago Up 16 seconds awesome_goldstine
  5. [root@izhp3f2wn461rak5gw97qmz ~]# docker attach 67ac6333c955

执行docker run -d 进入守护式进程.
注意: 容器是否会长久运行,是和 docker run 指定的命令有关,和 -d 参数无关。-d 的可选性参数只是告诉以守护进程的方式运行容器,但是如果容器命令执行完成了,容器依旧会退出。

  1. # docker run -d ubuntu
  2. 3656aef035277e43db546beb561d1ca16da3c5c62003d7006dc656fdbc1e84e0
  3. [root@izhp3f2wn461rak5gw97qmz ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

所有要真正保持后台运行,需要让容器一直在执行任务

  1. $docker run --name dloop -d ubuntu /bin/sh -c "while true; do echo hello docker; sleep 1; done"
  2. ef58053656cf327d91c5cd84ffd43e9d6841ca2769ea6bb147172f05263fe6e6
  3. [root@izhp3f2wn461rak5gw97qmz ~]# docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. ef58053656cf ubuntu "/bin/sh -c 'while t…" 6 seconds ago Up 5 seconds dloop

设置容器的端口映射。-P(大写p)会随机分配端口地址映射到容器内开放端口

  1. $docker run -d -P training/webapp python app.py
  2. $docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 02672e5ba524 training/webapp "python app.py" About a minute ago Up About a minute 0.0.0.0:32768->5000/tcp sad_mcnulty

运行一个Nginx,使用小写p会把8081端口映射到容器nginx的80端口

  1. $ docker run --name nginx-server -d -p 8081:80 nginx
  2. $ docker ps
  3. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  4. 1877cb8bd295 nginx "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 0.0.0.0:8081->80/tcp nginx-server

在浏览器输入http://localhost:8081/
image.png

查看

查看当前运行的容器

  1. $ docker ps

加上可选参数-a 查看所有容器,包括停止的。

  1. $ docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 3e1bab595731 ubuntu "/bin/bash" 6 minutes ago Exited (0) 19 seconds ago silly_bose
  4. 7083178d6228 ubuntu "echo 'Hello world'" 3 days ago Exited (0) 3 days ago sharp_darwin
  5. 94236af3ffe3 ubuntu "echo 'Hello world'" 3 days ago Exited (0) 3 days ago competent_mclean
  6. 3abb0fad0d5a ubuntu "echoHello world" 3 days ago Created kind_hermann
  7. 1b3e189b2e5f ubuntu:16.04 "echo baxiang" 5 days ago Exited (0) 5 days ago

exec

交互方式进入正在运行的容器内

  1. docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS说明:
-d : 分离模式: 在后台运行
-i : 即使没有附加也保持STDIN 打开
-t : 分配一个伪终端

  1. $ docker ps
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 1877cb8bd295 nginx "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:8081->80/tcp nginx-server
  4. $ docker exec -it 1877cb8bd295 /bin/sh

查看容器的详细信息

  1. docker inspect [NAME]/[CONTAINER ID]
  1. $ docker inspect nginx-server

查看守护容器后台日志,-t显示时间 -f更新日志记录 —tail 显示日志数量—tail 0 显示最新的日志记录

  1. docker logs -tf --tail 0 dloop

查看容器的进程 docker top

  1. docker top dloop

attach

  1. $ docker run -dit ubuntu:18.04
  2. a3b83915f2b5da1f5db403144b0927ba60bee3e9d33d2c8f8c5b44913ef07e07
  3. $ docker ps
  4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  5. a3b83915f2b5 ubuntu:18.04 "/bin/bash" 6 seconds ago Up 3 seconds fervent_elbakyan
  1. $ docker attach a3b83915f2b5
  2. root@a3b83915f2b5:/# cat /etc/hosts
  3. 127.0.0.1 localhost

注意: 如果从attach这个 stdin 中 exit,会导致容器的停止。,因此推荐使用exec

  1. $ docker attach a3b83915f2b5
  2. root@a3b83915f2b5:/# exit
  3. exit

logs

获取容器的日志

  1. docker logs [OPTIONS] CONTAINER

创建名称是ubuntu,每次间隔5秒一次 打印hello world

  1. $ docker run --name ubuntu -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 5; done"
  2. 4eff8d4b321f9ad9d14ce1699fa6bfa3cec65e6ac92246863534ce4c344a6693

查看从2019-10-22 最后5条的日志 日志显示时间 实时更新

  1. $ docker logs -f -t --since="2019-10-22" --tail=5 ubuntu
  2. 2019-10-22T06:52:19.682373723Z hello world
  3. 2019-10-22T06:52:24.683517587Z hello world
  4. 2019-10-22T06:52:29.685187780Z hello world
  5. 2019-10-22T06:52:34.686586813Z hello world
  6. 2019-10-22T06:52:39.687291795Z hello world
  7. 2019-10-22T06:52:44.688653575Z hello world

OPTIONS说明:

  • -f : 跟踪日志输出
  • —since :显示某个开始时间的所有日志
  • -t : 显示时间戳
  • —tail :仅列出最新N条容器日志

追查容器错误
启动MySQL容器

  1. $ docker run --name mysql -p3306:3306 -d mysql:5.7
  2. 5c1f16b761b8ea56feb14c86f83aae668a36ed6498c1d984914cc8d7b2839dda

但是使用 docker ps 会发现容器启动失败

  1. docker docker ps -a
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  3. 5c1f16b761b8 mysql:5.7 "docker-entrypoint.s…" 5 minutes ago Exited (1) 5 minutes ago mysql

查看容器Mysql 日志 ,发现必须设置Mysql的登录密码

  1. $ docker logs mysql
  2. 2019-10-23 06:39:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.28-1debian9 started.
  3. 2019-10-23 06:39:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
  4. 2019-10-23 06:39:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.28-1debian9 started.
  5. 2019-10-23 06:39:41+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
  6. You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

增加环境变量参数-e 设置登录可以为空 注意生产环境不建议这么使用

  1. $docker container prune
  2. $docker run --name mysql -p3306:3306 -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7

终止

将容器退出

  1. $docker stop [NAME]/[CONTAINER ID]

强制容器退出

  1. $docker kill [NAME]/[CONTAINER ID]

启动

启动已经停止的容器

  1. $docker start [OPTIONS] CONTAINER [CONTAINER...]

重新启动容器

  1. $docker restart [OPTIONS] CONTAINER [CONTAINER...]

在运行中的容器开启一个新的进程

  1. $ docker exec -i -t dloop /bin/bash
  2. root@ef58053656cf:/# read escape sequence# 让容器进入后台
  3. $ docker top dloop

删除

  1. $docker rm [NAME]/[CONTAINER ID]

注意不能够删除一个正在运行的容器,会报错。需要先停止容器。

1)首先需要停止所有的容器

  1. $docker stop $(docker ps -a -q)

2)删除所有的容器(只删除单个时把后面的变量改为image id即可)

  1. $docker rm $(docker ps -a -q)

或者使用

docker container prune

  1. $docker container prune
  2. WARNING! This will remove all stopped containers.
  3. Are you sure you want to continue? [y/N] y
  4. Deleted Containers:
  5. 80c6d9902fb87bbf3fd73cc57ec1568d4b7e02934a6a0fba33a05e382d252705

拷贝

从容器里面拷文件到宿主机,在宿主机里面执行以下命令

  1. $docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

eg:

  1. $ docker run -d --name nginx -p 80:80 nginx
  2. $ docker cp nginx:/etc/nginx/nginx.conf ~/Downloads/

从宿主机拷文件到容器里面,在宿主机里面执行以下命令

  1. $docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

commit 镜像构建

docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。

  1. docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]

参考

https://docs.docker.com/engine/reference/commandline/run/
https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/—volumes-from.html