Docker 的学习主要可分为容器操作及 Image 建置两部分,今天透过一些简单的 Lab 来学习容器操作的基本方式以及一些实用技巧。
若想要在自己的环境下安装 Docker,可以参考 Install Docker Engine 指南,本次 Lab 中,我们会使用在Day5 中介绍的 Cloud Shell,里面已经安装好 Docker 的环境,只要透过浏览器就能直接使用。
进入 Cloud Shell 网站
确认右上角编辑器与终端机皆已开启
点击终端机输入指令
检查docker版本,确认是否已安装
docker -v
(输出结果)
Docker version 20.10.8, build 3967b7d
来试着使用 Container 建立出 Nginx 的应用,分为两个步骤
首先需要找到包含 Nginx 应用的 Image ,可以到 Docker Hub 上搜寻。
找到 Image 之後,就可以透过docker run <image>
建立容器,并下参数 -p <主机port>:<容器port>
,当对主机的8080连接埠发出请求,就转送到容器的80连接埠。
docker run -p 8080:80 -d nginx
(输出结果)
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a330b6cecb98: Pull complete
5ef80e6f29b5: Pull complete
f699b0db74e3: Pull complete
0f701a34c55e: Pull complete
3229dce7b89c: Pull complete
ddb78cb2d047: Pull complete
Digest: sha256:a05b0cdd4fc1be3b224ba9662ebdf98fe44c09c0c9215b45f84344c12867002e
Status: Downloaded newer image for nginx:latest
dc761dce1ebbfe59d55c01b84d49536ca9aa19ded5d94c520adcb16d032334ad
建立过程中,Docker 会先到本地端寻找有无名称叫 nginx 的 Image ,发现没有後就会从 Docker Hub 寻找,并将其下载至本地端。接着就会将 Image 放入容器里执行,可以使用docker ps
来查看容器状况。
docker ps
(输出结果)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
dc761dce1ebb nginx "/docker-entrypoint.…" 2 minutes ago Up 45 seconds 0.0.0.0:8080->80/tcp
Status 显示 Up 代表成功运行,可以透过浏览器实际验证一下。
网页预览->透过以下通讯预览 : 8080
在浏览器上可以看到 Nginx 服务成功运行。
建好 container 之後,可以试着对它进行更多操作。
docker ps
(输出结果)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
14941dce1ebb nginx "/docker-entrypoint.…" 2 minutes ago Up 45 seconds 0.0.0.0:8080->80/tcp
接着使用docker exec <container id> <command>
来对容器下指令,其中的<container id>
可以从docker ps
的显示结果得知,在输入时只要输入前4-5码 (如 1494) 就可以顺利执行。
<container id>
改成你的容器 iddocker exec <container id> curl http://localhost
(输出结果)
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
若一次要输入多个指令,可以直接进入到容器里面操作,方法就是利用exec
的指令执行/bin/sh
,并且带入参数-it
。
exec
指令执行容器的 shell,将<container id>
改成你的容器 iddocker exec -it <container id> /bin/sh
ls
来检查是否已进入到容器ls
进入到容器内部,把index.html
档案置换掉。
index.html
档案位置cd /usr/share/nginx/html && ls
(输出结果)
50x.html index.html
index.html
档案cat > index.html <<EOF
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Container</title>
<style>
h1 {
text-align:center;
font-weight: 300;
font-size: 60px;
font-family: monospace;
}
</style>
</head>
<body>
<h1>This is my first container project</h1>
</body>
</html>
EOF
exit
网页预览->透过以下通讯预览 : 8080
在浏览器上可以看到新的 html 档案。
若将刚建立的容器删除掉,里面新建的index.html
也会一并消失,所以如果遇到容器内部档案会有修改的情形(如资料库资料、网页档案),就可以使用 Docker Volume,透过存储卷,就能够将本地的路径 Mount 到容器里的路径,当容器消失後,档案还是能保留在主机里。以下就透过实际 Lab 来练习如何建立 Docker Volume 来保留index.html
档案。
<container id>
改成你的容器 iddocker stop <container id>
<container id>
改成你的容器 iddocker rm <container id>
docker ps -a
(输出结果)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
删除完容器後,我们先在本地建立资料夹作为存储卷,并放入 index.html 档案。
nginx
资料夹cd && mkdir nginx
index.html
档案cd nginx && touch index.html
接着来试着使用 Cloud Shell Editor 来编辑index.html
档案
左上 Explorer -> Open Folder -> 选择nginx资料夹 -> Open
index.html
档案并贴上以下内容<!DOCTYPE html>
<html>
<head>
<title>Welcome to Cloud Shell</title>
<style>
h1 {
text-align:center;
font-weight: 300;
font-size: 60px;
font-family: monospace;
}
</style>
</head>
<body>
<h1>From Docker volume</h1>
</body>
</html>
设定完成之後,就可以来启动容器了,这次我们多新增了-v <主机path>:<容器path>
来建立存储卷。
docker run -d -p 8080:80 -v ~/nginx:/usr/share/nginx/html nginx
(输出结果)
56a2f5c01c580f6c4c3bc53905176cddd48dcac950955c5509319325755eac0e
因为本地端已经有 Nginx 的 Image 了,所以这次启动就不会下载 Image了。
网页预览->透过以下通讯预览 : 8080
在浏览器上可以看到新的 html 档案。
可以尝试修改index.html
档案,或是把刚刚的容器给删除,来确认看看与你设想的情况是否吻合。
今天透过 Docker Lab 来熟悉容器操作的基本技巧,明天将着重在如何建置 Image 并上传到 Container Registry上。
>>: [Day 7] .Net WhenAll 底层(2)
MSW,顾名思义是使用 Service Worker 实作 API mocking 的套件,在今年...
点击进入React源码调试仓库。 概述 每个fiber节点在更新时都会经历两个阶段:beginWor...
题目连结 程序码: #include <iostream> using namespac...
假设今天有个状况是这样:有一笔日志,新增第二笔但还没送出前,想将第一笔删除,这时会发生什麽事呢? 竟...
Aloha!我是少女人妻 Uerica!最近在看加密演算法时,觉得这些想出如何加密、如何更安全的传送...