容器子进程是上帝进程( 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