常用命令
docker container --help
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a running container
commit Create a new image from a container's changes
cp Copy files/folders between a container and the local filesystem
create Create a new container
diff Inspect changes to files or directories on a container's filesystem
exec Run a command in a running container
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers
logs Fetch the logs of a container
ls List containers
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
run Run a command in a new container
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
Run 'docker container COMMAND --help' for more information on a command.
启动容器
run
创建并启动一个容器 docker run 命令
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 可以避免 浪费空间。 |
创建一次性容器
$ docker run ubuntu:16.04 echo "baxiang"
baxiang
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1b3e189b2e5f ubuntu:16.04 "echo baxiang" 17 seconds ago Exited (0) 16 seconds ago nifty_lichterman
交互型
进入容器内,执行cat 查看本地host信息
$ docker run -i -t ubuntu:18.04 /bin/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.2 d0cc61b2acd8
#
后台运行
执行命令Ctrl+P加速Ctrl+Q的方式让容器成为守护式容器
docker run -i -t ubuntu
root@67ac6333c955:/# [root@izhp3f2wn461rak5gw97qmz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67ac6333c955 ubuntu "/bin/bash" 17 seconds ago Up 16 seconds awesome_goldstine
将守护式进程从后台再次进入前台交互执行docker attach
docker run -i -t ubuntu
root@67ac6333c955:/# [root@izhp3f2wn461rak5gw97qmz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67ac6333c955 ubuntu "/bin/bash" 17 seconds ago Up 16 seconds awesome_goldstine
[root@izhp3f2wn461rak5gw97qmz ~]# docker attach 67ac6333c955
执行docker run -d 进入守护式进程.
注意: 容器是否会长久运行,是和 docker run
指定的命令有关,和 -d
参数无关。-d 的可选性参数只是告诉以守护进程的方式运行容器,但是如果容器命令执行完成了,容器依旧会退出。
# docker run -d ubuntu
3656aef035277e43db546beb561d1ca16da3c5c62003d7006dc656fdbc1e84e0
[root@izhp3f2wn461rak5gw97qmz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
所有要真正保持后台运行,需要让容器一直在执行任务
$docker run --name dloop -d ubuntu /bin/sh -c "while true; do echo hello docker; sleep 1; done"
ef58053656cf327d91c5cd84ffd43e9d6841ca2769ea6bb147172f05263fe6e6
[root@izhp3f2wn461rak5gw97qmz ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef58053656cf ubuntu "/bin/sh -c 'while t…" 6 seconds ago Up 5 seconds dloop
设置容器的端口映射。-P(大写p)会随机分配端口地址映射到容器内开放端口
$docker run -d -P training/webapp python app.py
$docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
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端口
$ docker run --name nginx-server -d -p 8081:80 nginx
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1877cb8bd295 nginx "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 0.0.0.0:8081->80/tcp nginx-server
在浏览器输入http://localhost:8081/
查看
查看当前运行的容器
$ docker ps
加上可选参数-a 查看所有容器,包括停止的。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e1bab595731 ubuntu "/bin/bash" 6 minutes ago Exited (0) 19 seconds ago silly_bose
7083178d6228 ubuntu "echo 'Hello world'" 3 days ago Exited (0) 3 days ago sharp_darwin
94236af3ffe3 ubuntu "echo 'Hello world'" 3 days ago Exited (0) 3 days ago competent_mclean
3abb0fad0d5a ubuntu "echoHello world" 3 days ago Created kind_hermann
1b3e189b2e5f ubuntu:16.04 "echo baxiang" 5 days ago Exited (0) 5 days ago
exec
交互方式进入正在运行的容器内
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明:
-d : 分离模式: 在后台运行
-i : 即使没有附加也保持STDIN 打开
-t : 分配一个伪终端
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1877cb8bd295 nginx "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:8081->80/tcp nginx-server
$ docker exec -it 1877cb8bd295 /bin/sh
查看容器的详细信息
docker inspect [NAME]/[CONTAINER ID]
$ docker inspect nginx-server
查看守护容器后台日志,-t显示时间 -f更新日志记录 —tail 显示日志数量—tail 0 显示最新的日志记录
docker logs -tf --tail 0 dloop
查看容器的进程 docker top
docker top dloop
attach
$ docker run -dit ubuntu:18.04
a3b83915f2b5da1f5db403144b0927ba60bee3e9d33d2c8f8c5b44913ef07e07
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3b83915f2b5 ubuntu:18.04 "/bin/bash" 6 seconds ago Up 3 seconds fervent_elbakyan
$ docker attach a3b83915f2b5
root@a3b83915f2b5:/# cat /etc/hosts
127.0.0.1 localhost
注意: 如果从attach这个 stdin 中 exit,会导致容器的停止。,因此推荐使用exec
$ docker attach a3b83915f2b5
root@a3b83915f2b5:/# exit
exit
logs
获取容器的日志
docker logs [OPTIONS] CONTAINER
创建名称是ubuntu,每次间隔5秒一次 打印hello world
$ docker run --name ubuntu -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 5; done"
4eff8d4b321f9ad9d14ce1699fa6bfa3cec65e6ac92246863534ce4c344a6693
查看从2019-10-22 最后5条的日志 日志显示时间 实时更新
$ docker logs -f -t --since="2019-10-22" --tail=5 ubuntu
2019-10-22T06:52:19.682373723Z hello world
2019-10-22T06:52:24.683517587Z hello world
2019-10-22T06:52:29.685187780Z hello world
2019-10-22T06:52:34.686586813Z hello world
2019-10-22T06:52:39.687291795Z hello world
2019-10-22T06:52:44.688653575Z hello world
OPTIONS说明:
- -f : 跟踪日志输出
- —since :显示某个开始时间的所有日志
- -t : 显示时间戳
- —tail :仅列出最新N条容器日志
追查容器错误
启动MySQL容器
$ docker run --name mysql -p3306:3306 -d mysql:5.7
5c1f16b761b8ea56feb14c86f83aae668a36ed6498c1d984914cc8d7b2839dda
但是使用 docker ps 会发现容器启动失败
docker docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c1f16b761b8 mysql:5.7 "docker-entrypoint.s…" 5 minutes ago Exited (1) 5 minutes ago mysql
查看容器Mysql 日志 ,发现必须设置Mysql的登录密码
$ docker logs mysql
2019-10-23 06:39:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.28-1debian9 started.
2019-10-23 06:39:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2019-10-23 06:39:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.28-1debian9 started.
2019-10-23 06:39:41+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD
增加环境变量参数-e 设置登录可以为空 注意生产环境不建议这么使用
$docker container prune
$docker run --name mysql -p3306:3306 -d -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql:5.7
终止
将容器退出
$docker stop [NAME]/[CONTAINER ID]
强制容器退出
$docker kill [NAME]/[CONTAINER ID]
启动
启动已经停止的容器
$docker start [OPTIONS] CONTAINER [CONTAINER...]
重新启动容器
$docker restart [OPTIONS] CONTAINER [CONTAINER...]
在运行中的容器开启一个新的进程
$ docker exec -i -t dloop /bin/bash
root@ef58053656cf:/# read escape sequence# 让容器进入后台
$ docker top dloop
删除
$docker rm [NAME]/[CONTAINER ID]
注意不能够删除一个正在运行的容器,会报错。需要先停止容器。
1)首先需要停止所有的容器
$docker stop $(docker ps -a -q)
2)删除所有的容器(只删除单个时把后面的变量改为image id即可)
$docker rm $(docker ps -a -q)
或者使用
docker container prune
$docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
80c6d9902fb87bbf3fd73cc57ec1568d4b7e02934a6a0fba33a05e382d252705
拷贝
从容器里面拷文件到宿主机,在宿主机里面执行以下命令
$docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径
eg:
$ docker run -d --name nginx -p 80:80 nginx
$ docker cp nginx:/etc/nginx/nginx.conf ~/Downloads/
从宿主机拷文件到容器里面,在宿主机里面执行以下命令
$docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径
commit 镜像构建
docker commit 命令,可以将容器的存储层保存下来成为镜像。换句话说,就是在原有镜像的基础上,再叠加上容器的存储层,并构成新的镜像。以后我们运行这个新镜像的时候,就会拥有原有容器最后的文件变化。
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
参考
https://docs.docker.com/engine/reference/commandline/run/
https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/—volumes-from.html