容器是由镜像实例化而来的。
查看本地容器进程
# 列出本地正在运行的容器进程
docker ps
# 列出本地所有状态的容器进程
docker ps -a
可以查看到之前通过“hello-world”镜像运行的容器信息,当前状态是退出的(在23小时之前就退出了,因为这个镜像容器运行时只做了一个流的输出,然后就结束了),这个容器的启动命令是“/hello",名称是"jovial_rubin"(这个在没有指定时,是系统随机产生的)。再运行一个hello-worle(docker run hello-world)容器,就可以查看到两个已经退出的容器。标记出的内容一个是容器ID一个是镜像,镜像都是hello-world(即:docker.io/library/hello-world:latest).
启动容器
启动命令格式:详细
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
# []中都是可选项
OPTIONS:
- -i:表示启动一个可交换式的容器,并持续打开标准输出
- -t:表示使用当前终端关联到容器的标准输入输出上
- -d:表示容器放置到后台运行
- –rm:退出后即删除容器(前面两个杠)
- –name:表示定义容器唯一名称(前面两个杠)
IMAGE:表示利用哪个镜像实例化容器
COMMAND:启动容器时要执行的命令
ARG:表示COMMAND的参数
交互式运行一个容器
# docker run -it adminhubo/alpine:latest /bin/sh
docker run -i -t adminhubo/alpine:latest /bin/sh
启动后会进入到容器的交互式程序,可以在里面执行命令产看容器中的目录结构,IP地址等信息:再连接一个当前机器的终端查看现在的容器进程:
可以看到一个通过adminhubo/alpine:latest镜像创建的容器处于UP状态。通过exit退出交互式终端,容器也将变成退出状态。
非交互式运行一个容器
# docker run IMAGE
# 这里添加一些参数,让容器启动时执行echo命令输出,执行完成后退出,退出后就删除容器
docker run --rm adminhubo/alpine:latest /bin/echo hello
运行容器时不会出现交互式终端,并且会输出hello,查看容器也找不到刚启动的容器:
后台运行一个容器
# docker run -d IMAGE
# 这里添加了--name选项,给容器起了一个名称;加了一个sleep命令让容器运行300秒
docker run -d --name myAlpine adminhubo/alpine:latest /bin/sleep 300
后台运行一个容器时,docker守护进程再启动容器时会返回一个容器标识:docker有三种容器标识,可以再官网产看到:
在宿主机上查看容器进程
# 查看刚才执行 /bin/sleep 300 命令的容器在宿主机上对应的进程
# 如果没有查到,可能是容器已经运行300秒退出了(可以用后面的命令运行退出的容器)
ps aux | grep sleep | grep -v grep
进入容器
# 通过exec(execute)进入一个UP状态的容器
# docker exec -ti CONTAINER_ID /bin/sh
docker exec -ti 606cf5a247a2 bin/sh
进入容器后可以用ps查看进程,第一个就是容器运行时执行的进程
终止、运行、重启一个存在的容器
# 显示的停止一个容器
# docker stop CONTAINER_ID/CONTAINER_NAME
docker stop 606cf5a247a2
# 运行一个存在的容器
# docker start CONTAINER_ID/CONTAINER_NAME
docker start 606cf5a247a2
# 重启一个存在的UP状态的容器
# docker start CONTAINER_ID/CONTAINER_NAME
docker restart 606cf5a247a2
删除一个存在的容器
# docker rm CONTAINER_ID/CONTAINER_NAME
只能删除退出的容器,如果要删除正在运行的容器需要加-f删除UP状态的容器时,提示:在删除或者强行删除运行中的容器要先停止它,所以最好不要用 -f 直接删除一个running的容器。
# 循环删除已经停止的容器
for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm $i;done
在容器中修改,并固化到镜像中
# docker commit -p CONTAINER_NAME NEW_IMAGE_FALLNAME
# 之前的步骤删除了所有容器,现在重新运行一个,然后让他运行十分钟之后再退出
docker run -d --name myAlpine adminhubo/alpine:latest /bin/sleep 600
# 进入容器,新增一个hello.txt文件,文件中写入一些字符
docker exec -it myAlpine /bin/sh
等容器退出运行(或者重启容器)之后再次启动这个容器, hello.txt 文件依然存在,但是如果通过镜像重新运行一个实例,那么不会有这个文件。这表示,对容器镜像修改时写个了容器的可写层,二镜像时只读的,对容器的写不会改变镜像。
# 将对容器的修改固化到镜像中
# docker commit -p CONTAINER_ID/CONTAINER_NAME NEW_IMAGE_FALLNAME
docker commit -p myAlpine myAlpine adminhubo/alpine:latest_with_hello
将新的镜像可以push到仓库管理。
导入导出镜像
# 导出镜像
# docker save IMAGEID > SAVE_NAME
docker save 9bb5adfd5fd9 > myAlpine-v-with-hello.tar
# 导入镜像,把之前的删掉重新导入
# docker load < SAVE_NAME
docker rmi -f 9bb5adfd5fd9
# 通过刚才保存的镜像导入
docker load < myAlpine-v-with-hello.tar
# 导入的镜像没有名称以及tag,需要通过命令指定
docker tag 9bb5adfd5fd9 adminhubo/alpine:latest_with_hello_load
可以把导出的文件分发给其他人,方便部署
查看容器日志
# docker logs CONTAINER_ID/CONTAINER_NAME
# 运行启动一个hello-world容器,但是不把日志打印到终端,而是重定向到/dev/null(黑洞),就是不显示输出日志
docker run hello-world 2>&1 >> /dev/null
# 利用logs产看日志
docker logs 678dfc6f6c61
docker logs -f {容器ID} 可以实时输出日志,类似tail -f 命令