目录
参考书目: 黄靖钧. Docker从入门到实战[M]. 机械工业出版社, 2017.
一、容器的概念
Docker容器是镜像的运行实例。容器在镜像已有的文件层添加一层可读可写的文件层,使得容器就像是一个动态的镜像。所以,docker的内部结构必定与镜像结构十分相似。
如图所示,在docker容器中包含docekr镜像层以及在镜像层上建立的只读初始化层以及可读写层。在初始化层存储的大多是容器环境初始化时与容器相关的环境信息(容器主机名、主机host信息和域名服务文件)。可读写层用到了写时复制技术,虽然docker容器在可读写层可以看到数据卷的内容,但仅是挂载点,真实内容在宿主机上。
二、容器的基本操作
命令 | 说明 |
---|---|
attach | 依附到正在运行的容器 |
cp | 从容器里面复制文件或者目录到宿主机文件系统或以STDOUT形式输出 |
create | 创建一个新的容器 |
diff | 检查容器的文件系统改动 |
events | 实时获得Docker服务器端的事件信息 |
exec | 在一个运行的容器里面运行命令 |
export | 导出容器的文件系统到一个归档文件 |
kill | 杀死一个运行中的容器 |
logs | 获取容器的日志 |
pause | 暂停容器内部的所有进程 |
port | 输出容器的端口信息 |
ps | 显示容器列表 |
rename | 重命名一个容器 |
restart | 重启容器 |
rm | 删除一个或者多个容器 |
run | 运行一个新容器 |
start | 运行一个或者多个非运行状态的容器 |
stats | 实时显示容器的资源使用情况 |
stop | 停止正在运行的容器 |
top | 显示容器内正在运行的进程 |
unpause | 恢复容器内部所有进程 |
update | 更新一个或多个容器的配置 |
wait | 阻塞指导容器停止,然后打印他的退出代码 |
三、容器操作实例
3.1 docker create
# 创建一个容器
gupan@ubuntu:~$ sudo docker create -it ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
a48c500ed24e: Pull complete
1e1de00ff7e1: Pull complete
0330ca45a200: Pull complete
471db38bcfbf: Pull complete
0b4aba487617: Pull complete
Digest: sha256:c8c275751219dadad8fa56b3ac41ca6cb22219ff117ca98fe82b42f24e1ba64e
Status: Downloaded newer image for ubuntu:latest
59df0946091d4b0408521404413e5a501977c1153667220ad28774ab290bf17a
gupan@ubuntu:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59df0946091d ubuntu "/bin/bash" 2 minutes ago Created laughing_saha
gupan@ubuntu:~$
3.2 docker run
启动容器有两种情况
1. 原来没有这个容器,需要基于一个镜像启动新的容器
2. 宿主机本来有一个容器,但是这个容器处于非运行状态,可以把这个容器启动起来
使用docker run新建容器并启动,用这个容器来输出一句话
# 使用docker run新建容器并启动,用这个容器来输出一句话
gupan@ubuntu:~$ sudo docker run ubuntu /bin/echo "Hello World"
Hello World
# 查看容器状态
gupan@ubuntu:~$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a2b868de95b ubuntu "/bin/echo 'Hello ..." 35 seconds ago Exited (0) 33 seconds ago gallant_poitras
59df0946091d ubuntu "/bin/bash" 10 minutes ago Created laughing_saha
gupan@ubuntu:~$
启动容器的内部运行步骤
- 检查本地是否存在这个镜像,如果没有就从仓库下载
- 如果有检查命令是否有参数冲突
- 利用本地镜像创建一个容器
- 挂载可读写层,启动容器的一系列配置(各种资源隔离操作)
- 在应用参数值时,如果入到参数有误,启动会终止
- 如果没有问题则执行应用程序,执行完毕终止容器
案例:
# -i 代表让容器的标准输出始终打开
# -t 让Docker分配一个标准并绑定到容器标准输出上
# -it 代表绑定到容器内部,因此在该终端下执行的动作会在容器内部执行
gupan@ubuntu:~$ sudo docker run -it ubuntu bash
root@374d959286b5:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
10 ? 00:00:00 ps
root@374d959286b5:/#
# 退出当前容器
root@374d959286b5:/# exit
exit
gupan@ubuntu:~$
后台运行容器
d参数:代表后台运行
sudo docker run -d nginx:alpine
自动重启容器