容器镜像管理 容器网络 私有仓库配置
镜像制作
Commit打包镜像
docker images # 查看当前镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest 491198851f0c 27 hours ago 1.23MB
redis latest 82629e941a38 2 years ago 95MB
nginx latest 42b4762643dc 2 years ago 109MB
ubuntu latest 20bb25d32758 2 years ago 87.5MB
centos latest 76d6bc25b8a5 2 years ago 200MB
docker run --name mytest -it centos:latest
7d7560a14f44
rm -f /etc/yum.repos.d/*.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.myhuaweicloud.com/repo/CentOS-Base-7.repo
yum install -y net-tools vim-enhanced tree bash-completion iproute psmisc && yum clean all
#下载新的东西 yum源用华为云内网的
exit #退出
docker commit 7d7560a14f44 myos:latest #创建新的镜像
sha256:88033a9fc1ca104a2e4e3f609b5ea885158e5fee20bc5a268d313ded75210f06
docker images #查看镜像
#新的myos镜像
myos latest 88033a9fc1ca 3 minutes ago 281MB
busybox latest 491198851f0c 27 hours ago 1.23MB
redis latest 82629e941a38 2 years ago 95MB
nginx latest 42b4762643dc 2 years ago 109MB
ubuntu latest 20bb25d32758 2 years ago 87.5MB
centos latest 76d6bc25b8a5 2 years ago 200MB
Dockerfile打包镜像
- Dockerfile语法 docker build -t 镜像名称:标签 Dockerfile所在目录
语法指令 | 语法说明 |
---|---|
FROM | 基础镜像 |
RUN | 制作镜像时执行的命令,可以有多个 |
ADD | 复制文件到镜像,自动解压 url文件下载(不建议下载 会创建更多的镜像层 使用curl wget代替) |
COPY | 复制文件到镜像,不解压 --from=0 参数可以把前一阶段的产物拷贝到当前的镜像中 |
EXPOSE | 声明开放的端口 |
ENV | 设置容器启动后的环境变量 |
WORKDIR | 定义容器默认工作目录(cd命令) |
CMD | 容器启动时执行的命令,仅可以有一条CMD |
tip 加速镜像技巧
使用COPY和ADD命令时,可以通过把一些不容易发生变化的文件拷贝操作放到较低的镜像层中,这样在重新build镜像时就会使用前面build产生的缓存
ls
config.py #配置文件 基本不动
web.py #经常修改的配置文件
vim Dockerfile
====================
....
WORKDIR /config
COPY config.py . #将不容易修改的放到较低的镜像层
WORKDIR /html
COPY web.py . #将容易修改的配置文件放到后面执行
......
=============================
#当执行多次修改build时,修改了web.py 到config.py的COPY都可以直接拿缓存过来生成
- 制作apache镜像
mkdir web
cd web
vim Dockerfile
============================
FROM myos2:latest
RUN yum install -y httpd php
ENV LANG=C
ADD webhome.tar.gz /var/www/html/
COPY info.php /var/www/html/
WORKDIR /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd","-DFOREGROUND"] #逗号没写,导致运行容器没有默认正确启动命令 查半天
=========================================
docker build -t myos:httpd . #Dockerfile在当前目录下 webhome.tar.gz也在当前目录下
docker run -itd --name php -p 8080:80 myos:httpd #80端口映射到宿主机的8080端口
curl http://172.17.0.2/index.php #访问
hello php Dockerfile #成功访问到.php结尾的网页 放在webhome.tar.gz里面了
docker exec -it php /bin/bash #进去看下
[root@fb137501c1c0 html]# #WORKDIR设置了 进去就是/var/www/html/了
#绑定公网IP
公网IP:8080 #对外发布了
- 制作php-fpm镜像
yum install -y php-fpm
mkdir php; cd php
cp /etc/php-fpm.d/www.conf ./
vim www.conf
=========================
12: listen = 0.0.0.0:9000 #监听所有9000端口
24: ;listen.allowed_clients = 127.0.0.1 #注释掉只允许本机访问9000的这行
=======================================
cp /root/info.php ./ #复制info.php到当前目录下
vim Dockerfile
===============================
FROM myos:latest
RUN yum install -y php-fpm
COPY www.conf /etc/php-fpm.d/www.conf
EXPOSE 9000
WORKDIR /usr/local/nginx/html
COPY info.php info.php
CMD ["/usr/sbin/php-fpm", "--nodaemonize"]
=================================
docker build -t myos:php-fpm . #供本机使用 所以不需要绑定宿主机端口 直接使用即可
- 制作nginx镜像
wget -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #用阿里的yum源 华为的版本对不上
yum install -y gcc make pcre-devel openssl-devel #安装nginx源码编译所需包 正则 ssl
useradd nginx #创建用户
tar -zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
make && make install
#源码编译nginx
cd /usr/local/
cp /root/info.php nginx/html/; cp /root/info.html nginx/html/ #复制网页到Nginx网页目录下
tar -czf nginx.tar.gz nginx
mkdir /root/nginx; cd /root/nginx
cp /usr/local/nginx.tar.gz ./
vim Dockerfile
==============================
FROM myos:latest
RUN yum install -y pcre openssl && useradd nginx
ADD nginx.tar.gz /usr/local/ #将自己网页文件压缩包解压放到容器里面
EXPOSE 80
WORKDIR /usr/local/nginx/html
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
===================================
docker build -t myos:nginx . #制作镜像
- 容器间网络通信
mkdir -p /var/{webroot,webconf}
cp info.php info.html /var/webroot/
cp /usr/local/nginx/conf/nginx.conf /var/webconf/
vim /var/webconf/nginx.conf #修改配置文件解析
=============================
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
==============================
#启动nginx服务 映射网页目录和配置文件目录
docker run -itd --name nginx -p 80:80 \
-v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf \
-v /var/webroot:/usr/local/nginx/html myos:nginx
#启动php-fpm服务 映射网页目录
docker run -itd --network=container:nginx \ #container模式 使用上面nginx容器的网络
-v /var/webroot:/usr/local/nginx/html myos:php-fpm #需要共享网页解析 所以也要共享
curl http://localhost/info.html #映射了本机端口 所以可以访问了
curl http://localhost/info.php
docker inspcet nginx | grep IPAdd #过滤出容器网络
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
docker inspcet | grep IPAdd #过滤php-fpm的网络
"SecondaryIPAddresses": null, #使用相同网络命令(Network Namespace)空间
"IPAddress": "", #没有独立的IP 共享网络172.17.0.2 两个容器进程通过lo网卡设备通信
iptables -t nat -vnL | grep :80 #查看下nat表
0 0 MASQUERADE tcp -- * * 172.17.0.2 172.17.0.2 tcp dpt:80
2 100 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80 #docker run -p 本质都是对本地iptable的表进行规制设置 上面是把宿主机的转发给了172.17.0.2:80
- Docker container网络模式,这种模式可以节约一定的网络资源,并能降低容器间的通信难度,container网络模式使多个容器共享网络环境,在这种模式下容器可以通过访问localhost来访问namespace下的其他容器,网络性能更高
私有仓库配置
主机名 | IP地址 | 最低配置 |
---|---|---|
registry | 192.168.1.100 | 1CPU,1G内存 |
yum install -y docker-distribution
systemctl enable --now docker-distribution
curl http://192.168.1.100:5000/v2/_catalog
{"repositories":[]}
- docker客户端配置
vim /etc/docker/daemon.json
==========================
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://hub-mirror.c.163.com"],
"insecure-registries":["192.168.1.100:5000", "registry:5000"] #私有仓库 Http
}
===============================
docker rm -f $(docker ps -aq)
systemctl restart docker
- 上传镜像
docker tag myos:latest 192.168.1.100:5000/myos:latest #建立镜像标签
docker push 192.168.1.100:5000/myos:latest #上传
- 验证
curl http://192.168.1.100:5000/v2/_catalog
{"repositories":["myos"]}
curl http://192.168.1.100:5000/v2/myos/tags/list
{"name":"myos","tags":["latest"]}
docker run -it 192.168.1.100:5000/myos:latest