容器子进程是上帝进程( PID == 1 )

容器上帝进程不能关闭

在容器的所有服务都放在前台运行,容器在后台运行

镜像制作

commit打包镜像
docker commit 容器ID 新镜像名称:标签
[root@docker-0001 ~]# docker run -it centos:latest #创建容器
[root@e95a7b4bcfc1 /]# rm -f /etc/yum.repos.d/*.repo #删除之前的yum
[root@e95a7b4bcfc1 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.myhuaweicloud.com/repo/CentOS-Base-7.repo #重新下载
yum % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1737 100 1737 0 0 104k 0 --:--:-- --:--:-- --:--:-- 106k
[root@e95a7b4bcfc1 /]# yum install -y net-tools vim-enhanced tree bash-completion iproute psmisc && yum clean all #下载软件,清理缓存
[root@e95a7b4bcfc1 /]# exit #退出容器
exit
[root@docker-0001 ~]# docker commit e95a7b4bcfc1 myos:latest #打包镜像,容器ID根据创建容器时生成的
sha256:165672a364a32e69d125ffae9fc90b33ac8bba8b6a5a339dcb7b4ba9c6a4cf62

Dockerfile打包镜像

Dockerfile语法

语法指令

语法说明

FROM

基础镜像

RUN

制作镜像时执行的命令,可以有多个

ADD

复制文件到镜像,自动解压

COPY

复制文件到镜像,不解压

EXPOSE

声明开放的端口

ENV

设置容器启动后的环境变量

WORKDIR

定义容器默认工作目录(等于cd)

CMD

容器启动时执行的命令,仅可以有一条CMD

使用Dockerfile创建镜像

docker build -t 镜像名称:标签 Dockerfile所在目录

制作Apache镜像

CMD 指令可以查看 service 文件的启动命令 ExecStart(/lib/systemd/system/httpd.service)

ENV 环境变量查询服务文件中的环境变量配置文件 EnvironmentFile 指定的文件内容

[root@docker-0001 ~]# mkdir apache; cd apache
 [root@docker-0001 apache]# vim Dockerfile
 FROM myos:latest                          #使用的镜像
 RUN  yum install -y httpd php                     #下载软件包
 ENV  LANG=C                                     #设置环境变量
 ADD  webhome.tar.gz  /var/www/html/
WORKDIR /var/www/html/                           #workdir0 代替cd命令,远程执行cd命令无效 run 相当于 ssh
 EXPOSE 80                                       #开放端口80
 CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
 # 拷贝 webhome.tar.gz 到当前目录中
 [root@docker-0001 apache]# docker build -t myos:httpd .

查看与验证镜像

[root@docker-0001 web]# docker images
 REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
 myos                httpd               db15034569da        12 seconds ago      412MB
 myos                latest              867409e412c8        2 hours ago         281MB
 [root@docker-0001 web]# docker rm -f $(docker ps -aq)
 [root@docker-0001 web]# docker run -itd myos:httpd
 [root@docker-0001 web]# curl http://172.17.0.2/info.php
 <pre>
 Array
 (
     [REMOTE_ADDR] => 172.17.0.1
     [REQUEST_METHOD] => GET
     [HTTP_USER_AGENT] => curl/7.29.0
     [REQUEST_URI] => /info.php
 )
 php_host:     6c9e124bee1a
 1229

制作PHP镜像(默认前台服务)

[root@docker-0001 ~]# mkdir php; cd php
 [root@docker-0001 php]# vim Dockerfile
 FROM myos:latest
 RUN  yum install -y php-fpm
 EXPOSE 9000
 CMD ["/usr/sbin/php-fpm", "--nodaemonize"]
 [root@docker-0001 php]# docker build -t myos:php-fpm .

验证服务

[root@docker-0001 ~]# docker run -itd myos:php-fpm
 deb37734e52651161015e9ce7771381ee6734d1d36bb51acb176b936ab1b3196
 [root@docker-0001 ~]# docker ps
 CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS
 deb37734e526        myos:php-fpm        "/usr/sbin/php-fpm -…"   17 seconds ago      Up 15 seconds       
 [root@docker-0001 ~]# docker exec -it deb37734e526 /bin/bash
 [root@deb37734e526 ~]# ss -ltun
 Netid  State      Recv-Q        Send-Q          Local Address:Port         Peer Address:Port 
 tcp    LISTEN     0             128             127.0.0.1:9000             *:*
 [root@deb37734e526 ~]#

微服务架构

Nginx+php-fpm+mysql

将应用拆分成多个核心功能,可以单独构建和部署 解决了复杂性问题

优点:高度可扩展,出色的弹性,易于部署,易于访问,更加开发 松藕合高内聚更适合CI/CD

核心 "拆"

发布镜像服务

对外发布服务

给 docker-0001 绑定一个公网IP

docker run -itd -p 宿主机端口:容器端口 镜像名称:标签

把 docker-0001 变成 apache 服务

[root@docker-0001 ~]# docker run -itd -p 80:80 myos:httpd

把 docker-0001 变成 nginx 服务,首先必须停止 apache

[root@docker-0001 ~]# docker stop $(docker ps -q) [root@docker-0001 ~]# docker run -itd -p 80:80 myos:nginx

验证方式: 通过浏览器访问即可

容器共享卷

docker run -itd -v 宿主机对象:容器内对象 镜像名称:标签

使用共享卷动态修改容器内配置文件

[root@docker-0001 ~]# mkdir /var/webconf [root@docker-0001 ~]# cp /usr/local/nginx/conf/nginx.conf /var/webconf/ [root@docker-0001 ~]# vim /var/webconf/nginx.conf location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } [root@docker-0001 ~]# docker run -itd -p 80:80 --name nginx \ -v /var/webconf/nginx.conf:/usr/local/nginx/conf/nginx.conf myos:nginx

验证方式: 使用 exec 进入容器查看

[root@docker-0001 ~]# docker exec -it nginx /bin/bash [root@e440b53a860a html]# cat /usr/local/nginx/conf/nginx.conf [root@e440b53a860a html]# # 查看 php 相关配置是否被映射到容器内

容器间通信

模式:

host 与宿主机共享网络

container ,共享其他容器的网络命名空间

none ,无网络模式

bridge ,默认模式

自定义网络,自由创建桥接网络或者overlay网络

[root@docker-0001 ~]# mkdir -p /var/{webroot,webconf} [root@docker-0001 ~]# cd kubernetes/docker-images [root@docker-0001 ~]# cp info.php info.html /var/webroot/ [root@docker-0001 ~]# cp /usr/local/nginx/conf/nginx.conf /var/webconf/ [root@docker-0001 ~]# vim /var/webconf/nginx.conf location ~ .php$ { root html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; }

启动前端 nginx 服务,并映射共享目录和配置文件

[root@docker-0001 ~]# 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 服务,并映射共享目录

[root@docker-0001 ~]# docker run -itd --network=container:nginx \ -v /var/webroot:/usr/local/nginx/html myos:php-fpm

验证服务

[root@docker-0001 ~]# curl http://docker-0001/info.html <html> <marquee behavior="alternate"> <font size="12px" color=#00ff00<Hello World</font> </marquee> </html
 [root@docker-0001 ~]# curl http://docker-0001/info.php

<pre>
 Array
 (
     [REMOTE_ADDR] => 172.17.0.1
     [REQUEST_METHOD] => GET
     [HTTP_USER_AGENT] => curl/7.29.0
     [REQUEST_URI] => /info.php
 )
 php_host:     f705f89b45f9
 1229

私有镜像仓库

购买一台云主机 拷贝软件包docker-distribution

[root@registry ~]# yum install -y docker-distribution #下载 [root@registry ~]# systemctl enable --now docker-distribution #启动 [root@registry ~]# curl http://192.168.1.100:5000/v2/_catalog #访问测试 {"repositories":[]}
[root@ecs-7646 ~]# cat /etc/docker-distribution/registry/config.yml #配置文件 version: 0.1 log: fields: service: registry storage: cache: layerinfo: inmemory filesystem: rootdirectory: /var/lib/registry #存放数据目录 http: addr: :5000

客户端配置

所有node节点都需要配置,这里 docker-0001,docker-0002都要配置

native.cgroupdriver cgroup驱动,docker默认 cgroupfs
registry-mirrors 默认下载仓库,使用国内源能快一点
insecure-registries 私有仓库地址(重点)
[root@docker-0001 ~]# cd /etc/docker/ [root@docker-0001 docker]# ls key.json [root@docker-0001 docker]# vim daemon.json
{ "exec-opts": ["native.cgroupdriver=systemd"], #docker使用cgroup驱动 cgroupfs/systemd 稳定性更好一点 "registry-mirrors": ["https://hub-mirror.c.163.com"], #默认下载仓库,镜像源 "insecure-registries":["192.168.1.100:5000", "registry:5000"] #私有仓库地址,IP根据实际情况填写 }
[root@docker-0001 docker]# docker rm -f $(docker ps -aq) #删除容器 [root@docker-0001 docker]# systemctl restart docker #重启docker [root@docker-0001 docker]# scp daemon.json root@192.168.1.32:./ #拷贝到docker002主机上 root@192.168.1.32's password: daemon.json 100% 193 976.0KB/s 00:00

上传镜像

[root@docker-0001 docker]# docker tag myos:latest 192.168.1.100:5000/myos:latest [root@docker-0001 docker]# docker push 192.168.1.100:5000/myos:latest The push refers to repository [192.168.1.100:5000/myos] c9faab75013e: Pushed bcc97fbfc9e1: Pushed latest: digest: sha256:55ab8be8410156e991ab5bd1355188f4d6bfb31d7a511bb407c5a35f36d5ab5c size: 741