Day07 - Docker 101 容器操作篇

前言

Docker 的学习主要可分为容器操作及 Image 建置两部分,今天透过一些简单的 Lab 来学习容器操作的基本方式以及一些实用技巧。

重点整理

环境建置

若想要在自己的环境下安装 Docker,可以参考 Install Docker Engine 指南,本次 Lab 中,我们会使用在Day5 中介绍的 Cloud Shell,里面已经安装好 Docker 的环境,只要透过浏览器就能直接使用。

  1. 进入 Cloud Shell 网站

  2. 确认右上角编辑器与终端机皆已开启

  1. 点击终端机输入指令

  2. 检查docker版本,确认是否已安装

docker -v

(输出结果)

Docker version 20.10.8, build 3967b7d

使用 Docker 建立 Nginx 服务

来试着使用 Container 建立出 Nginx 的应用,分为两个步骤

  • 找到需要使用的 Image
  • 带正确的参数启动 Container

首先需要找到包含 Nginx 应用的 Image ,可以到 Docker Hub 上搜寻。

找到 Image 之後,就可以透过docker run <image>建立容器,并下参数 -p <主机port>:<容器port>,当对主机的8080连接埠发出请求,就转送到容器的80连接埠。

  1. 建立 Nginx 容器
  • Image: nginx
  • 将本机 8080 Port 转送到容器 80 Port : -p 8080:80
  • 需要在背景执行: -d
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来查看容器状况。

  1. 查看所有容器
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 代表成功运行,可以透过浏览器实际验证一下。

  1. 在 Cloud Shell 点击网页预览->透过以下通讯预览 : 8080

在浏览器上可以看到 Nginx 服务成功运行。

编辑 Nginx 服务

建好 container 之後,可以试着对它进行更多操作。

  1. 查看所有容器
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) 就可以顺利执行。

  1. 使用 curl 来检查首页回传内容,将<container id>改成你的容器 id
docker 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

  1. 使用exec指令执行容器的 shell,将<container id>改成你的容器 id
docker exec -it <container id> /bin/sh
  1. 使用 ls 来检查是否已进入到容器
ls

进入到容器内部,把index.html档案置换掉。

  1. 移动到 nginx 放置 index.html 档案位置
cd /usr/share/nginx/html && ls

(输出结果)

50x.html  index.html
  1. 取代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
  1. 完成操作以後,就可以退出 shell 了
exit
  1. 在 Cloud Shell 点击网页预览->透过以下通讯预览 : 8080

在浏览器上可以看到新的 html 档案。

使用 Docker 存储卷

若将刚建立的容器删除掉,里面新建的index.html也会一并消失,所以如果遇到容器内部档案会有修改的情形(如资料库资料、网页档案),就可以使用 Docker Volume,透过存储卷,就能够将本地的路径 Mount 到容器里的路径,当容器消失後,档案还是能保留在主机里。以下就透过实际 Lab 来练习如何建立 Docker Volume 来保留index.html档案。

  1. 停止 container,将<container id>改成你的容器 id
docker stop <container id>
  1. 删除 container,将<container id>改成你的容器 id
docker rm <container id>
  1. 确认是否已成功删除
docker ps -a

(输出结果)

CONTAINER ID  IMAGE  COMMAND                CREATED       STATUS        PORTS   

删除完容器後,我们先在本地建立资料夹作为存储卷,并放入 index.html 档案。

  1. 建立nginx资料夹
cd && mkdir nginx
  1. 建立index.html档案
cd nginx && touch index.html

接着来试着使用 Cloud Shell Editor 来编辑index.html档案

  1. 点击左上 Explorer -> Open Folder -> 选择nginx资料夹 -> Open

  1. 点击index.html档案并贴上以下内容

  • 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>
  1. 按 Ctrl + s 储存

设定完成之後,就可以来启动容器了,这次我们多新增了-v <主机path>:<容器path>来建立存储卷。

  1. 建立 Nginx 容器
  • Image: nginx
  • 将本机 8080 Port 转送到容器 80 Port : -p 8080:80
  • 需要在背景执行: -d
  • 存储卷: ~/nginx:/usr/share/nginx/html
docker run -d -p 8080:80 -v ~/nginx:/usr/share/nginx/html nginx

(输出结果)

56a2f5c01c580f6c4c3bc53905176cddd48dcac950955c5509319325755eac0e

因为本地端已经有 Nginx 的 Image 了,所以这次启动就不会下载 Image了。

  1. 在 Cloud Shell 点击网页预览->透过以下通讯预览 : 8080

在浏览器上可以看到新的 html 档案。

可以尝试修改index.html档案,或是把刚刚的容器给删除,来确认看看与你设想的情况是否吻合。

总结

今天透过 Docker Lab 来熟悉容器操作的基本技巧,明天将着重在如何建置 Image 并上传到 Container Registry上。


<<:  [Day7]2 the 9s

>>:  [Day 7] .Net WhenAll 底层(2)

工作散记 - 在本机开发环境建置MSW

MSW,顾名思义是使用 Service Worker 实作 API mocking 的套件,在今年...

完全理解React的completeWork以及错误边界

点击进入React源码调试仓库。 概述 每个fiber节点在更新时都会经历两个阶段:beginWor...

[C 语言笔记--Day20] 解题纪录 10190 Divide, But Not Quite Conquer!

题目连结 程序码: #include <iostream> using namespac...

Day 18 修改add()方法

假设今天有个状况是这样:有一笔日志,新增第二笔但还没送出前,想将第一笔删除,这时会发生什麽事呢? 竟...

【在厨房想30天的演算法】Day 27 资讯安全与演算法 : 迪菲-赫尔曼密钥交换

Aloha!我是少女人妻 Uerica!最近在看加密演算法时,觉得这些想出如何加密、如何更安全的传送...