docker 容器
1. docker 守护进程daemon
Daemon是Docker的守护进程,Docker Client通过命令行与Docker Damon通信,完成Docker相关操作,Docker daemon通过位于/var/run/docker.sock的本地IPC/Unix socket来实现Docker远程API;在Windows中,Docker daemon通过监听名为npipe:////./pipe/docker_engine的管道来实现。通过配置,也可以借助网络来实现Docker Client和daemon之间的通信。Docker默认非TLS网络端口为2375,TLS默认端口为2376。
UNIX域套接字
默认就是这种方式, 会生成一个 /var/run/docker.sock 文件, UNIX 域套接字用于本地进程之间的通讯, 这种方式相比于网络套接字效率更高, 但局限性就是只能被本地的客户端访问。TCP 端口监听
服务端开启端口监听:dockerd -H IP:PORT
客户端通过指定的 IP 和 端口 访问服务端:docker -H IP:PORT,从而在服务端的服务器上创建容器。
2. docker container相关操作
2.1 相关命令
在实际操作过程中部分命令container可以省略。
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
2.2 启动容器
启动容器的一个简单的方式是通过docker container run命令。
docker container run ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
Status: Downloaded newer image for ubuntu:latest
由于本地不存在ubuntu:latest镜像,启动时从docker hub pull对应镜像并启动。一旦镜像拉取到本地,daemon就创建容器并在其中运行指定的应用。
通过docker ps发现容器退出了,因为启动时没有启动任何进程,此时启动容器时额外启动一个进程。
docker container run -it ubuntu bash
root@7f1b6cf7b7aa:/# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 4626 - 06:37 pts/0 00:00:00 bash
0 R root 11 1 0 80 0 - 8599 - 06:38 pts/0 00:00:00 ps -elf
当执行exit时会退出1号进程,则容器也会停止运行,“杀死容器中的主进程,则容器也会被杀死”。因此可以执行Ctrl-PQ组合键则会退出容器但并不终止容器运行。这样做会切回到Docker主机的Shell,并保持容器在后台运行。
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f2c72504e24 ubuntu "bash" 20 seconds ago Up 19 seconds sweet_heisenberg
也可以启动时+ -d让容器后台运行。
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f2c72504e24 ubuntu "bash" 20 seconds ago Up 19 seconds sweet_heisenberg
docker container stop 3f2c72504e24
3f2c72504e24
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker container run -it -d ubuntu bash
c95be4dcad34d69693964158138ce19f946b13afd669012659e5cff7715f0400
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c95be4dcad34 ubuntu "bash" 11 seconds ago Up 10 seconds priceless_hofstadter
此时再进入容器可以执行
docker exec -it c95be4dcad34 bash
2.3 容器生命周期
节主要关注容器的生命周期——从创建、运行、休眠,直至销毁的整个过程。
- 启动容器
docker container run --name percy -it ubuntu:latest /bin/bash
- 停止容器
docker container stop命令来停止容器运行,切换到暂停(vacation)状态。
docker container stop percy
- 重启容器
使用docker container start命令可以将容器重新启动。
docker container start percy
- 删除容器
通过在docker container rm命令后面添加-f参数来一次性删除运行中的容器是可行的。但是,删除容器的最佳方式还是分两步,先停止容器然后删除。这样可以给容器中运行的应用/进程一个停止运行并清理残留数据的机会。
docker container rm percy
总结一下容器的生命周期。可以根据需要多次停止、启动、暂停以及重启容器,并且这些操作执行得很快。但是容器及其数据是安全的。直至明确删除容器前,容器都不会丢弃其中的数据。就算容器被删除了,如果将容器数据存储在卷中,数据也会被保存下来。
2.4 查看容器详情
当构建Docker镜像的时候,可以通过嵌入指令来列出希望容器运行时启动的默认应用。如果运行docker image inspect命令来查看运行容器时使用的镜像,就能看到容器启动时将要运行的应用列表了。同时通过docker container inspect c95be4dcad34 可以查看容器详情
3. 总结
docker container run是启动新容器的命令。该命令的最简形式接收镜像和命令作为参数。镜像用于创建容器,而命令则是希望容器运行的应用。docker container run -it ubuntu /bin/bash命令会在前台启动一个Ubuntu容器,并运行Bash Shell。
Ctrl-PQ会断开Shell和容器终端之间的链接,并在退出后保持容器在后台处于运行(UP)状态。
docker container ls用于列出所有在运行(UP)状态的容器。如果使用-a标记,还可以看到处于停止(Exited)状态的容器。
docker container exec允许用户在运行状态的容器中,启动一个新进程。该命令在将Docker主机Shell连接到一个运行中容器终端时非常有用。docker container exec -it <container-name or container-id> bash命令会在容器内部启动一个Bash Shell进程,并连接到该Shell。为了使该命令生效,用于创建容器的镜像必须包含Bash Shell。
docker container stop命令会停止运行中的容器,并将状态置为Exited(0)。该命令通过发送SIGTERM信号给容器内PID为1的进程达到目的。如果进程没有在10s之内得到清理并停止运行,那么会接着发送SIGKILL信号来强制停止该容器。docker container stop可以接收容器ID以及容器名称作为参数。
docker container start会重启处于停止(Exited)状态的容器。可以在docker container start命令中指定容器的名称或者ID。
docker container rm会删除停止运行的容器。可以通过容器名称或者ID来指定要删除的容器。推荐首先使用docker container stop命令停止容器,然后使用docker container rm来完成删除。
docker container inspect命令会显示容器的配置细节和运行时信息。该命令接收容器名称和容器ID作为主要参数。