使用OCI构建Docker镜像以使用Nginx

首先,在Oracle云基础设施(OCI)上,可以轻松地使用Nginx的Docker镜像。本次将介绍以下内容。

目录

    • 1. OCI Computeインスタンスに、Dockerをインストールする

2. Nginx Dockerの使用

2-1. HTTP用
2-2. HTTPS用

3. 実行中のコンテナーよりDockerイメージを作成
4. DockerイメージをOCI Registryにプッシュ

付録

Dockerfile (HTTP用)

image.png

1. 安装 Docker 。

登录到Compute实例后,使用以下命令安装Docker。

[opc@linux7-9 ~]$ sudo yum -y update
<省略>
[opc@linux7-9 ~]$ sudo yum install -y docker-engine
<省略>

如果要在Oracle Linux 8、9上进行安装,命令与Oracle Linux 7不同。

sudo dnf install -y dnf-utils zip unzip
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce --nobest

docker启动

[opc@linux7-9 ~]$ sudo systemctl start docker
[opc@linux7-9 ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

查看Docker信息
sudo docker info
sudo docker version

2. 使用Nginx Docker

中文进行处理通常不是一个好的选择,因为很多英文术语在中文中会有不同的表达方式。一种可能的翻译是:”HTTP协议使用”

只需要一个选项,将以下内容用中文进行本地化改写:
下载 Nginx 的镜像文件。

命令示例:docker拉取nginx

[opc@linux7-9 ~]$ sudo docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
75646c2fb410: Pull complete
6128033c842f: Pull complete
71a81b5270eb: Pull complete
b5fc821c48a1: Pull complete
da3f514a6428: Pull complete
3be359fed358: Pull complete
Digest: sha256:bae781e7f518e0fb02245140c97e6ddc9f5fcf6aecc043dd9d17e33aec81c832
Status: Downloaded newer image for nginx:latest
nginx:latest
[opc@linux7-9 ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              7ce4f91ef623        2 days ago          133MB
[opc@linux7-9 ~]$

Nginx的启动(HTTP)

命令示例:docker运行 –rm -d -p 8080:80 –name web nginx

参数含义:
–rm:在结束时自动删除容器
-d:后台执行
-p:将容器的端口公开给主机(外部使用8080端口)
–name:给容器分配一个名称

[opc@linux7-9 ~]$ sudo docker run --rm -d -p 8080:80 --name web nginx
90c2d54d7522af4e8be268640eccd1da65fa1be93210327c885b02bad9c226bc
[opc@linux7-9 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
90c2d54d7522        nginx               "/docker-entrypoint.…"   4 seconds ago       Up 3 seconds        0.0.0.0:8080->80/tcp   web
[opc@linux7-9 ~]$
undefined

停止Nginx
命令示例:docker stop <docker名称>(停止后将删除容器)

[opc@linux7-9 ~]$ sudo docker stop web
web
[opc@linux7-9 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[opc@linux7-9 ~]$

创建演示页面

[opc@linux7-9 ~]$ pwd
/home/opc
[opc@linux7-9 ~]$ mkdir -p nginx-demo/html
[opc@linux7-9 ~]$ echo "<h1>Hello Nginx</h1>" > nginx-demo/html/index.html
[opc@linux7-9 ~]$

在启动Nginx时,使用”-v”参数,挂载本地的演示页面。

[opc@linux7-9 ~]$ sudo docker run --rm -d -p 8080:80 -v /home/opc/nginx-demo/html:/usr/share/nginx/html --name web nginx
416decd04916337009b030dbaaf67c749a86a4c5dafa62003901774abc2a2c1d
[opc@linux7-9 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
416decd04916        nginx               "/docker-entrypoint.…"   10 seconds ago      Up 8 seconds        0.0.0.0:8080->80/tcp   web
[opc@linux7-9 ~]$
undefined

用curl命令进行确认

[opc@linux7-9 ~]$ curl localhost:8080
<h1>Hello Nginx</h1>
[opc@linux7-9 ~]$

2-2. HTTPS的使用

从容器中复制Nginx的配置。

[opc@linux7-9 ~]$ pwd
/home/opc
[opc@linux7-9 ~]$ sudo docker cp web:/etc/nginx .
[opc@linux7-9 ~]$ ll
total 4
drwxr-xr-x. 3 root root 4096 Mar 31 05:24 nginx
drwxrwxr-x. 3 opc  opc    18 Apr  7 08:37 nginx-demo
[opc@linux7-9 ~]$

复制后,停止Nginx。

[opc@linux7-9 ~]$ sudo docker stop web
web
[opc@linux7-9 ~]$

为了使用HTTPS,我们将使用OpenSSL创建证书。
-keyout: 私钥文件
-out: 证书文件
执行以下OpenSSL命令后,将创建nginx.key和nginx.crt文件。

[opc@linux7-9 nginx]$ pwd
/home/opc/nginx
[opc@linux7-9 nginx]$ sudo mkdir cert
[opc@linux7-9 nginx]$ cd cert
[opc@linux7-9 cert]$ sudo openssl req  -x509 -nodes -newkey rsa:2048 -keyout nginx.key -out nginx.crt
Generating a 2048 bit RSA private key
.........................................................................+++
....+++
writing new private key to 'nginx.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
[opc@linux7-9 cert]$ pwd
/home/opc/nginx/cert
[opc@linux7-9 cert]$ ll
total 8
-rw-r--r--. 1 root root 1281 Apr  7 09:37 nginx.crt
-rw-r--r--. 1 root root 1704 Apr  7 09:37 nginx.key
[opc@linux7-9 cert]$

编辑设置文件(nginx/conf.d/default.conf)。

[opc@linux7-9 conf.d]$ pwd
/home/opc/nginx/conf.d
[opc@linux7-9 conf.d]$ sudo vi default.conf

我将把以下内容添加到最后。

server {
    listen 443 ssl;
    server_name  localhost;
    ssl                      on;
    ssl_certificate          /etc/nginx/cert/nginx.crt;
    ssl_certificate_key      /etc/nginx/cert/nginx.key;
    ssl_session_timeout  3m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers   on;
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

使用新容器重新启动Nginx。
添加参数的含义:
公开HTTPS端口(8081→443)。
挂载本地文件。

[opc@linux7-9 conf.d]$ sudo docker run --rm -d -p 8080:80 -p 8081:443 \
\>    -v /home/opc/nginx-demo/html:/usr/share/nginx/html -v /home/opc/nginx:/etc/nginx \
\>   --name web nginx
e7024bb33c29f1fd99f77586b443d4597eb4784d569f43b5cc83a7fcb60d41da
[opc@linux7-9 conf.d]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
e7024bb33c29        nginx               "/docker-entrypoint.…"   12 seconds ago      Up 11 seconds       0.0.0.0:8080->80/tcp, 0.0.0.0:8081->443/tcp   web
[opc@linux7-9 conf.d]$
undefined

在使用curl命令进行确认

[opc@linux7-9 ~]$ curl https://localhost:8081 -k
<h1>Hello Nginx</h1>
[opc@linux7-9 ~]$

3. 创建Docker镜像于运行中的容器。

停止上述示例中使用的容器,并创建一个新的容器。

[opc@linux7-9 ~]$ sudo docker stop web
web
[opc@linux7-9 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[opc@linux7-9 ~]$

在创建新的容器时,这次不使用”-v”(挂载)选项。(HTTP/HTTPS端口的公开方式与上述相同。)

[opc@linux7-9 ~]$ sudo docker run --name web --rm -d -p 8080:80 -p 8081:443 nginx
210f4ef2decf4460ab882e20136ade6d1c2aa962e8350fd1a86afa702cea4890
[opc@linux7-9 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
210f4ef2decf        nginx               "/docker-entrypoint.…"   11 seconds ago      Up 10 seconds       0.0.0.0:8080->80/tcp, 0.0.0.0:8081->443/tcp   web
[opc@linux7-9 ~]$

复制以下文件以创建新的图像。

    将容器内的文件替换为本地的index.html。
[opc@linux7-9 ~]$ cat /home/opc/nginx-demo/html/index.html
<h1>Hello Nginx</h1>
[opc@linux7-9 ~]$ sudo docker cp /home/opc/nginx-demo/html/index.html web:/usr/share/nginx/html/index.html
[opc@linux7-9 ~]$
    将default.conf和证书文件复制到容器中。
[opc@linux7-9 ~]$ sudo docker cp /home/opc/nginx/conf.d/default.conf  web:/etc/nginx/conf.d/default.conf
[opc@linux7-9 ~]$ sudo docker cp /home/opc/nginx/cert  web:/etc/nginx/cert
[opc@linux7-9 ~]$

复制后,请重新启动容器。
(注意:如果不重新启动,HTTPS的修正将不会生效。)

[opc@linux7-9 ~]$ sudo docker restart web
web
[opc@linux7-9 ~]$

创建新形象

命令示例:docker commit :
示例:docker commit web nginx_demo:latest

指令示例:将容器提交到仓库中,并添加标签
示例:将web容器提交到nginx_demo仓库中,并添加latest标签

[opc@linux7-9 ~]$ sudo docker commit web nginx_demo:latest
sha256:1a6774abd5a84528de51462acbd7ebc58d0e17e3048a24f46f5909cdeaceed7b
[opc@linux7-9 ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx_demo          latest              1a6774abd5a8        10 seconds ago      133MB
nginx               latest              7ce4f91ef623        5 weeks ago         133MB
[opc@linux7-9 ~]$

停止正在运行的容器,并从新镜像(nginx_demo)创建容器。

[opc@linux7-9 ~]$ sudo docker stop web
web
[opc@linux7-9 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[opc@linux7-9 ~]$ sudo docker run --name web --rm -d -p 8080:80 -p 8081:443 nginx_demo
c50b3c43f45c96e7a5429eebda2d05042e293051a5693ae8978d982412da3a1a
[opc@linux7-9 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                         NAMES
c50b3c43f45c        nginx_demo          "/docker-entrypoint.…"   25 seconds ago      Up 23 seconds       0.0.0.0:8080->80/tcp, 0.0.0.0:8081->443/tcp   web
[opc@linux7-9 ~]$

可以用curl命令进行确认。 (也可以使用网络浏览器)

[opc@linux7-9 ~]$ curl localhost:8080
<h1>Hello Nginx</h1>
[opc@linux7-9 ~]$ curl https://localhost:8081 -k
<h1>Hello Nginx</h1>
[opc@linux7-9 ~]$

到此为止,新形象的创建已经完成。

将Docker镜像推送到OCI注册表。

Repo-Created.JPG

如果不是管理员进行操作,将创建以下类似的政策。

策略名称:可选
隔间:root/PoC (例)
声明:
允许 OCIR-Repo-Group 组在 PoC 隔间中使用仓库
(可执行操作的用户应添加到 OCIR-Repo-Group 组中)

登录到 OCI 注册表

命令:docker登录.ocir.io
:如果是东京地区,则为nrt。
确认方法,请参考列表。

命令执行后,将要求输入用户名和密码。
用户名:/
是在上面的”Container Registry”画面中显示的值。
是IDCS用户或OCI用户的名称。
对于IDCS用户,请以”oracleidentitycloudservice/xxxxxx”的格式输入。
密码:输入预先创建的身份验证令牌(Auth Token)的值。

注意:对于一些旧的租户,虽然命名空间的名称和租户的名称相同,但它们实际上是不同的事物,因此请务必确认命名空间的值,以避免错误。

[opc@linux7-9 ~]$ sudo docker login nrt.ocir.io
Username: tenancy-namespace/oracleidentitycloudservice/username
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[opc@linux7-9 ~]$

给图像添加标签
将要推送的图像加上标签。

指令:docker 标记 <镜像标识> <目标标签>

目标标签的格式:
.ocir.io//:

例:将1a6774abd5a8标记为nrt.ocir.io//repo-nginx:latest。

[opc@linux7-9 ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx_demo          latest              1a6774abd5a8        13 hours ago        133MB
nginx               latest              7ce4f91ef623        5 weeks ago         133MB
[opc@linux7-9 ~]$ sudo docker tag 1a6774abd5a8 nrt.ocir.io/namespace/repo-nginx:latest
[opc@linux7-9 ~]$ sudo docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
nginx_demo                            latest              1a6774abd5a8        16 hours ago        133MB
nrt.ocir.io/namespace/repo-nginx      latest              1a6774abd5a8        16 hours ago        133MB
nginx                                 latest              7ce4f91ef623        5 weeks ago         133MB
[opc@linux7-9 ~]$

将Docker镜像推送

命令:docker push <目标标签>
示例:docker push nrt.ocir.io/<命名空间>/repo-nginx:最新版本

[opc@linux7-9 ~]$ sudo docker push nrt.ocir.io/namespace/repo-nginx
The push refers to repository [nrt.ocir.io/namespace/repo-nginx]
70a619e5ea7e: Pushed
1914a564711c: Pushed
db765d5bf9f8: Pushed
903ae422d007: Pushed
66f88fdd699b: Pushed
2ba086d0a00c: Pushed
346fddbbb0ff: Pushed
latest: digest: sha256:18984c2de84daf6e8f95f4dc40806428f6a7b2919845b90c14fe13e82c97e1da size: 1778
[opc@linux7-9 ~]$

如果发生以下错误,请确认执行用户是否登录到OCI注册表中。
“拒绝访问:匿名用户只能对公共存储库进行读取访问”

repo-nginx.JPG

附加物

Dockerfile(用于HTTP)

这个例子是将Welcome页面替换,并发布在8080端口。

[opc@linux7-9 ~]$ cat Dockerfile
FROM nginx
RUN mkdir -p /usr/share/nginx/html
RUN echo "<h1>Hello Nginx</h1>" > /usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html
EXPOSE 8080

使用Dockerfile构建镜像的命令:sudo docker build -t nginx_demo .

以上


修改历史
2021/05/11:进行初版创作
2023/02/16:添加附录(Dockerfile)
2023/02/17:添加架构图


相关文章
个人博客中有关Oracle Cloud的相关内容
在OCI Compute实例上安装Nginx

使用Docker CLI推送镜像:官方文档

广告
将在 10 秒后关闭
bannerAds