使用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用)
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 ~]$
停止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 ~]$
用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]$
在使用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注册表。
如果不是管理员进行操作,将创建以下类似的政策。
策略名称:可选
隔间: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注册表中。
“拒绝访问:匿名用户只能对公共存储库进行读取访问”
附加物
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推送镜像:官方文档