容器是基于容器技术所建立和运行的轻量级应用运行环境,它是Docker封装和管理应用程序或微服务的「集装箱」,在Docker中,容器是最核心的部分。
一、容器的创建和启动
Docker容器的生命周期里分为五种状态,其分别代表着:
- Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运行状态。
- Running:容器正在运行,也即容器中的应用正在运行。
- Paused:容器已暂停,表示容器中的所有程序都处于暂停状态。
- Stopped:容器处于停止状态,占用的资源和沙盒环境都依然存在,只是容器中的应用程序均已停止。
- Deleted:容器已删除,相关占用的资源及存储在Docker中的管理信息也都已释放和移除。
A、创建容器
下载好镜像后,通过docker create命令创建容器。
docker create nginx
71d09fd4bd9eac512002ef290d89b61471efc3c7d539ea6c453c1de8575be938
执行docker create后,Docker会根据所给出的镜像创建容器,在控制台中会打印出Docker为容器所分配的容器ID,此时容器处于Created状态。
之后对容器的操作可以通过这个容器ID或者它的缩略形式进行,但用容器ID操作容器难以理解,所以更习惯于使用容器名来操作容器。
要使用容器名操作容器,就先得给容器命名,在创建容器时可以通过--name选项为配置容器名。
docker create --name redis redis
d7da13d7fc93fb6435d37ccf189b55f4388a4ed20363034761004278b8622a04
B、启动容器
通过docker create创建的容器,是处于Created 状态的,其内部的应用程序还没有启动,所以需要通过docker start命令来启动。
docker start 71d09fd4bd9eac512002ef290d89b61471efc3c7d539ea6c453c1de8575be938
docker start redis
当容器启动后,其中的应用就会运行起来,容器的生命周期也会绑定到了这个应用上,只要应用程序还在运行,那么容器的状态就会是Running,除非进行一些修改容器的操作。
在Docker里,可以通过docker run将docker create和docker start两步操作合成为一步,进一步提高工作效率。
docker run --name nginx -d nginx:1.12
docker run在启动容器时,会采用前台运行,可以通过-d或--detach选项告诉Docker在启动后通过后台运行。
C、停止和删除容器
通过docker stop停止正在运行的容器,容器停止后,维持的文件系统沙盒环境还是存在的,内部被修改的内容也都会保留,可以通过docker start命令将这个容器再次启动。
需要完全删除容器时,可以通过docker rm命令将容器进行删除。正在运行中的容器默认情况下是不能被删除,可以通过增加-f或--force选项来让docker rm强制停止并删除容器。
Docker是轻量级容器,短时间内不需要使用容器时,最佳的做法是删除它而不是停止它。
D、解决删除容器引起的问题
应用对容器内的文件进行了修改,删除容器,会将修改的文件也进行删除。
Docker的解决方案:
- 在Docker 中,打包镜像的成本非常低,速度也很快,所以如果需要为程序准备一些环境或者配置,完全可以直接将它们打包至新的镜像中,下次直接使用新的镜像创建容器即可。
- 容器中应用程序所产生的一些文件数据,是非常重要的,如果这些数据随着容器的删除而丢失,其损失是非常巨大的。对于这类由应用程序所产生的数据,并且需要保证它们不会随着容器的删除而消失的,可以使用Docker中的数据卷来单独存放。由于数据卷是独立于容器存在的,所以能保证数据不会随着容器的删除而丢失。
二、管理容器
容器创建和启动后,除了关注应用程序是否功能正常外,也会关注容器的状态等内容。
A、显示容器
docker ps列出Docker中的容器,通过-a或--all选项,列出所有状态的容器。
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d7da13d7fc93 redis "docker-entrypoint.s…" 9 minutes ago Up 8 minutes 6379/tcp redis
71d09fd4bd9e nginx "nginx -g 'daemon of…" 11 minutes ago Up 8 minutes 80/tcp zealous_wu
结果中的COMMAND表示的是容器中主程序(与容器生命周期所绑定进程所关联的程序)的启动命令,这条命令是在镜像内定义的,而容器的启动其实质就是启动这条命令。
B、进入容器
容器是隔离的运行环境,里面除了镜像所规定的主进程外,其他的进程也能够运行,Docker提供docker exec命令,让容器运行所给出的命令。
docker exec redis cat /etc/hostname
# CONTAINER ID
d7da13d7fc93
对于以上操作,多有不便,还是希望进入「容器」,执行命令。
docker exec -it redis bash
# 容器内的bash
root@d7da13d7fc93:/data# redis-cli
127.0.0.1:6379> ping
PONG
在借助docker exec进入容器的时候,需要添加-it选项,-i或--interactive表示保持输入流,-t或--tty表示启用一个伪终端,形成bash的交互。
C、挂接容器
Docker为提供了docker attach命令,用于将当前的输入输出流连接到指定的容器上。
docker attach nginx
这个命令最直观的效果可以理解为将容器中的主程序转为了前台运行,与docker run中的-d选项有相反的含义,实际开发过程中用的不多。
参考:
http://blog.poetries.top/2018/11/20/docker-base/