修改docker hub上的官方镜像

之前一直有个疑问,如果要在同一个Kubernetes的POD中部署两个系统镜像的容器,两个容器岂不是会有资源(网络端口号,文件等)冲突。在尝试在Kubernetes挂载不同的存储时就遇到同一个nginx镜像部署在同一个POD中,第二个POD始终失败的问题,查看日志也提示尝试多次终止了容器。猜测应该是在同一个POD中端口冲突导致第二个容器启动失败,于是修改官方nginx镜像的端口号成功在一个POD中启动了两个nginx容器。

具体操作如下:

从dokcer hub官方下载nginx:alpine镜像

docker pull nginx:alpine

查看镜像中的默认配置

1
2
docker run -it --name nginx  nginx:alpine /bin/sh
cat /etc/nginx/nginx.conf

修改官方镜像

  • 根据官方镜像修改端口号及默认目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
user  nginx;
worker_processes auto;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;


events {
worker_connections 1024;
}


http {
include /etc/nginx/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

sendfile on;
#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

server {
listen 8080;
listen [::]:8080;
server_name localhost;

#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;

location / {
root /usr/share/nginx/log;
# index index.html index.htm;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

}
  • 新的dockerfile
1
2
3
4
FROM nginx:alpine
RUN mkdir -p /usr/share/nginx/log
ADD index.html /usr/share/nginx/log/index.html
COPY nginx.conf /etc/nginx/nginx.conf
  • 构建新的镜像

docker build -t nginx:log .

本地测试成功以后就可以推送到自己的镜像仓库了:)。

完成第一个docker应用程序

本文参考《Kubernetes in action》中的案例,部署一个node.js应用。在vscode中搭建node.js开发环境请自行百度。

创建应用程序

1
2
3
4
5
6
7
8
var http=require('http');

http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('hello node.js');
}).listen(3000,'0.0.0.0',function(){
console.log('Server running at http://localhost:3000');
});

使用 node app.js启动应用程序,使用curl localhost:3000即可验证应用部署是否成功。

编写Dockerfile

1
2
3
FROM node:12
ADD app.js /app.js
ENTRYPOINT [ "node", "app.js" ]
> 注意: > 1. dockerfile 和app.js 在同一目录下 > 2. node版本号最好根据当期开发环境中版本保存一致,具体版本号使用node -v查询

制作镜像

在dockerfile目录下执行命令:sudo docker build -t kubia .

运行程序

sudo docker run --name kubia-container -p 3000:3000 -d kubia

验证应用

在浏览器中访问http://docker-ip:3000,浏览器显示hello node.js。docker ip可以通过ifconfig/ipconfig 命令查询

在Windwos 10 WSL2中安装Docker

最近在学习kubernets,正在阅读《Kubernetes in action》一书,为了感性化的理解书中内容决定同步在办公PC上安装书中涉及到工具和代码,今天先完成在win 10 WSL2中安装Docker。首先在win 10 WSL2中安装Docker想法是基于微软宣称的WSL2内核是真正的Linux内核,也就想当然的认为WSL2中的Ubuntu 20.04和在PC上直接安装是一致的,结果在安装过程中遇到各种小插曲。

打开硬件虚拟化支持

在BIOS中设置Intel虚拟化支持,进入到Virtualization选项中,设置Intel Virtual Technology为enable。重启以后即可在windows任务管理器-〉性能面板中查询虚拟化已开启。

升级WSL-〉WSL2

  • 升级win10到支持WLS2版本,Version 2004, Build 19041 or higher;

  • 设置WSL版本 在cmd中输入如下命令:wsl --set-default-version 2,将wsl版本设置为WSL2。

  • 安全ubuntu 20.04 在windows store中搜索ubuntu 20.04,安装ubuntu 20.04版本;安装完成后启动ubuntu 20.04系统提示

详细配置参考:https://docs.microsoft.com/en-us/windows/wsl/

安装Docker

  • 安装windows 10版本的Docker 不要直接使用系统apt的命令安装docker.io;建议下载windows 10的Docker版本,设置启动WSL即可。
  • 检查Docker安装是否成功 使用:sudo docker version查询docker版本: ### 如果显示如下信息则说明server端没有启动或者连接失败:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Client:
    Version: 19.03.12-ce
    API version: 1.40
    Go version: go1.14.4
    Git commit: 48a66213fe
    Built: Wed Jul 1 17:05:50 2020
    OS/Arch: linux/amd64
    Experimental: false
    Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.40/version": dial unix /var/run/docker.sock: connect: permission denied

  • 解决方案:
    • 使用sudo docker version查询,如果仍然显示失败;
    • 检查server是否启动

如果显示如下信息则说明启动成功:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Client:
Version: 19.03.12-ce
API version: 1.40
Go version: go1.14.4
Git commit: 48a66213fe
Built: Wed Jul 1 17:05:50 2020
OS/Arch: linux/amd64
Experimental: false

Server:
Engine:
Version: 19.03.12-ce
API version: 1.40 (minimum version 1.12)
Go version: go1.14.4
Git commit: 48a66213fe
Built: Wed Jul 1 17:05:26 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.3.4.m
GitCommit: d76c121f76a5fc8a462dc64594aea72fe18e1178.m
runc:
Version: 1.0.0-rc91
GitCommit: 24a3cf88a7ae5f4995f6750654c0e2ca61ef4bb2
docker-init:
Version: 0.18.0
GitCommit: fec3683

## 配置Docker

配置国内源

在Windows中配置国内源 配置Dokcer国内源时需要打开(图形化的)Docker Desktop,直接设置国内源即可;如果 在Linux系统中配置源,直接修改/etc/docker/daemon.json文件即可。详细请参考:https://docs.docker.com/registry/recipes/mirror/ 配置文件格式为JSON格式,例如:

1
2
3
{
"registry-mirrors": ["https://<my-docker-mirror-host>"]
}

常用的国内Docker如下: - docker官方中国区: https://registry.docker-cn.com - 网易: http://hub-mirror.c.163.com - ustc: http://docker.mirrors.ustc.edu.cn 可以同时配置多个源,例如:

1
2
3
4
5
6
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
]
}

重启Docker服务即可生效

在Linux执行如下命令:

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

如果重启提示错误可以可根据提示的命令定位错误原因。 > Job for docker.service failed because the control process exited with error code. > > See "systemctl status docker.service" and "journalctl -xe" for details.

查询配置是否生效

sudo docker info