容器 ( Container )
容器就是被隔离出来的虚拟环境
容器的生命周期: Created,Running,Paused,Stopped,Deleted
Running是真正在运行的容器
保持一个容器处在Running状态就需要容器中PID为1的进程一直运行着,一旦这个进程停止意味着容器的停止
容器启动进程往往由Dockerfile中最后的ENTRYPOINT或CMD决定
也就是这2选1个参数执行的shell脚本执行的程序不能报错,且必须停留在命令行上,
创建容器
1 | docker create --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:latest |
执行 docker create
后,Docker 会根据命令使用镜像创建容器,并在控制台打印出容器 ID,此时容器是处于 Created 状态的。
我们可以用容器ID或容器name来操作容器
启动容器
1 | docker start mysql |
通过 docker start
命令启动了容器
有人会说真麻烦,创建一步启动一步,下面就一键启动
看了docker start的参数发现它可以一次启动多个容器,也并非一无是处
1 | docker start [OPTIONS] CONTAINER [CONTAINER...] |
docker run
docker run
将docker create
和docker start
两步并作一步,容器创建后会立刻启动
docker run
是我们居家旅行杀人灭口必备命令,它能干的事非常多
高级内容,不熟可跳过
1 | docker run [OPTIONS] IMAGE:TAG [COMMAND] [ARG...] |
保持一个容器运行不退出的必须是 ENTRYPOINT 或 CMD 占据bash不退出的命令
实用命令
后台运行
后台启动一个以nginx最新版本镜像的容器,命名为mynginx
1 | docker run --name mynginx -d nginx:latest |
端口绑定
docker run 子命令启动容器,-p 将容器的 8000 端口映射到宿 主机的 8000 端口上,–name 给容器赋予一个唯一的名字, 最后一个参数是镜像
1 | docker run -p 8000:8000 --name $container_name $image_name |
交互方式运行
使用-t -i用交互方式运行
镜像名后面固定跟着的是 cmd
1 | docker run -t -i $image_name /bin/bash |
挂载目录
your_dir必须是绝对路径
1 | docker run -v /your_dir:/target_dir debian |
指定环境变量
启动一个mysql
1 | docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=123456 -d -e MYSQL_DATABASE=my_database -v /your_abs_dir:/var/lib/mysql mysql:latest |
容器退出时删除数据卷
1 | docker run --name xxx --rm mysql |
管理容器
查看容器列表
通过 docker ps
可以列出Docker中的容器
1 | docker ps |
1 | docker ps -a |
通过docker ps
可以看到容器ID(CONTAINER ID),使用镜像(IMAGE),执行命令(COMMAND),创建时间(CREATED),状态(STATUS),端口(PORTS),名称(NAMES)
其中状态(STATUS)有3种状态
- Created 此时容器已创建,但还没有被启动过
- Up [ Time ] 这时候容器处于正在运行状态,而这里的 Time 表示容器从开始运行到查看时的时间
- Exited ([ Code ]) [ Time ] 容器已经结束运行,这里的 Code 表示容器结束运行时,主程序返回的程序退出码,而 Time 则表示容器结束到查看时的时间
一般你都会看到第三种的,等你成为高手了总会是第二种,😊
停止容器
docker stop
1 | docker stop mysql |
容器停止后,内部被修改的内容会保留,可以通过 docker start 命令将这个容器再次启动
暂停恢复容器内进程
1 | docker pause mysql |
查看容器进程信息
1 | docker top mysql |
删除容器
docker rm
1 | docker rm mysql |
运行中的容器是不允许被删除的,可以加参数
1 | docker rm -f mysql |
进入容器
很多时候我们都想深入了解对方,是时候进入容器了
在容器内执行命令
1 | # docker exec [OPTIONS] CONTAINER COMMAND [ARG...] |
在容器内启动bash
1 | docker exec -it mysql /bin/bash |
查看容器日志
有时我们需要观察容器在启动和运行过程中打印在bash上的日志
1 | docker logs CONTAINER |
查看容器元数据
成为高手后会经常查看吧,反正我没看过
1 | docker inspect CONTAINER |
docker container
专门管理容器的命令,更细化了管理能力,我就不一一翻译了
1 | Usage: docker container COMMAND |
实用命令
停止所有的容器
1 | docker stop $(docker ps -a -q) |
删除所有容器
1 | docker rm $(docker ps -a -q) |
获取容器ip
1 | docker inspect \ |
查看所有容器进程信息
1 | for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done |