🔣docker安装

ubuntu安装

  1. 🔣设置存储库
  2. sudo apt-get remove docker docker-engine docker.io containerd runc
  3. 1.更新包索引并安装包,以允许通过 HTTPS 使用存储库
  4. apt update
  5. apt -y install apt-transport-https ca-certificates curl software-properties-common
  6. 2.添加Docker的官方GPG密钥
  7. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  8. 3.写入软件源信息
  9. echo \
  10. "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  11. $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
  12. 4.更新并安装docker-ce
  13. apt update
  14. apt install -y docker-ce
  15. apt-cache madison docker-ce #查找Docker-CE的版本
  16. apt -y install docker-ce=[VERSION] docker-ce-cli=[VERSION] #安装指定版本
  17. apt purge docker-ce #删除docker
  18. rm -rf /var/lib/docker #删除docker资源存放相关文件
  1. #默认docker从DockerHUB上拉取镜像下载镜像速度慢,可以配置国内镜像加速地址https://registry.docker-cn.com,当有多个镜像加速地址时候可在列表中以逗号分割。
  2. https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
  3. mkdir -p /etc/docker
  4. tee /etc/docker/daemon.json <<-'EOF'
  5. {
  6. "registry-mirrors": ["https://stgr0pjm.mirror.aliyuncs.com"]
  7. }
  8. EOF
  9. systemctl daemon-reload systemctl restart docker #重新启动守护进程
  10. docker info
  11. 解决SWAP报警提示:
  12. vim /etc/default/grub
  13. GRUB_DEFAULT=0
  14. GRUB_TIMEOUT_STYLE=hidden
  15. GRUB_TIMEOUT=2
  16. GRUB_DISTRIBUTOR=`lsb_ release -i -s 2> /dev/null || echo Debian`
  17. GRUB_CMDLINE_LINUX_DEFAULT=""
  18. GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 swapaccount=1" #修改此行
  19. update-grub
  20. reboot

centOS安装

  1. #CentOS7的extras源虽然可以安装docker但包比较旧,建议从官方源或镜像源站点下载安装docker
  2. wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  3. wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  4. yum clean all && yum makecache
  5. yum -y install docker-ce
  6. systemctl enable --now docker
  1. #CentOS8有新技术podman代替docker---建议在CentOS 7上安装docker
  2. yum list installed | grep docker #列出安装过的包
  3. yum -y remove docker-ce-cli.x86_64 #根据安装过的包进行卸载
  4. yum -y update docker #更新docker(更新至最新版本)
  5. #配置docker源,设置从仓库获取
  6. wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
  7. yum install -y yum-utils device-mapper-persistent-data lvm2
  8. yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  9. systemctl start docker && systemctl enable docker #启动

镜像管理

image.pngimage.png

  1. ls /var/lib/docker
  2. buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
  3. docker COMMAND --help
  4. docker search #搜索镜像版本
  5. docker pull alpine:3.13.5 #下载拉取镜像
  6. docker images #查看
  7. docker images -q #查看一半ImageID
  8. docker images --no-trunc #显示完整的ImageID
  9. docker image history nginx #查看镜像分层历史
  10. docker image ls --format "{{.Repository}}:{{.Tag}}" #查看镜像的名称和TAG
  11. docker tag alpine alpine:3.11 #给镜像打标签,类似于起别名
  12. docker rmi busybox(测试环境用) #删除镜像,有同名竟像时相当于删除硬链接
  1. 1.导出镜像
  2. docker image history nginx
  3. docker save mysql:5.7.30 -o /data/mysql5.7.29.tar
  4. docker save alpine:3.11.3 > /data/alpine.tar
  5. docker images | awk 'NR!=1{print $1,$2}' | while read repo tag;do docker save $repo:$tag -o /opt/$repo-$tag.tar ;done #导出多个镜像
  6. 2.导入镜像
  7. docker load -i /data/alpine.tar
  8. docker load < /data/mysql5.7.29.tar.gz
  9. for i in /data/*.tar; do docker load -i $i;done #导入多个镜像

容器操作

  1. docker run nginx
  2. #本地如果没有此镜像,则= pull + run + start
  3. #默认前台执行,容器启动后如果容器内没有前台运行的进程,将自动退出停止
  4. #运行时基于原有镜像在新的目录建立副本,基于副本文件启动进程,容器停止时则删除该临时文件
  5. -d 后台运行
  6. -it 进入容器 docker run -it nginx sh, exit,从容器内退出,并停止容器;ctrl+p+q,从容器内退出,且容器不停止
  7. -e 传递环境变量,也可以使用--env-file 实现
  8. -P 可以将事先容器预定义的所有端口映射宿主机的随机端口,默认从32768开始--->本质就是利用NAT技术实现的
  9. -p 8888:80 指定端口映射,实际上是自动建立iptablesDNAT规则
  10. --name 给容器命名方便操作
  11. --rm 容器一旦停止就删除此容器
  12. --restart=always 设置容器开机自动
  13. --privileged 使容器中root用户具有特权,让容器具备了控制宿主机的能0300
  14. -v 创建数据卷 ①宿主机目录:容器目录 ②容器目录 ③命名目录:容器目录
  15. --volumes-from 使用数据卷容器,关闭卷容器,仍然可以创建新的client容器及访问旧的client容器
  16. --link 容器名称互联
  17. --network 引用自定义网络
  18. docker ps -l #docker本质上就是一个进程,把镜像运行起来
  19. docker ps -f "status=exited" #只查看退出的容器
  20. docker ps -a -s #显示容器大小
  21. docker rm -f `docker ps qa` #强行删除所有在运行的容器
  22. docker exec -it web sh #进入正在运行的容器,且退出后不会停止
  23. docker attach web #类似于vnc,操作会在同一个容器的多个会话界面同步显示
  24. docker start
  25. docker stop
  26. docker kill
  27. docker top #查看容器内的进程
  28. docker stats #查看容器资源使用情况-a
  29. docker port #查看容器的端口映射关系
  30. docker logs
  31. #限制内存使用大小
  32. docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx128m" elasticsearch:7.6.2
  33. docker volume ls -q
  34. docker volume prune 不能删除正在使用的数据卷
  35. docker volume create vol3 创建数据卷
  36. docker rm -v 删除容器时只删除匿名卷,不会删除命名卷
  37. docker network ls
  38. docker network inspect
  39. docker network create -d 创建自定义网络模式
  40. docker network connect/disconnect 不同网络的容器通信

🔣镜像制作

由于容器启动和运行过程中是直接使用了宿主机的内核,不会直接调用过物理硬件,所以也不会涉及到硬件驱动,因此也无需容器内拥有自已的内核和驱动。而如果使用虚拟机技术,对应每个虚拟机都有自已独立的内核。
Docker容器如果希望启动后能持续运行,就必须有一个能前台持续运行的进程。否则会导致此容器启动后立即退出

基于容器手动制作镜像—docker commit

  1. 基于基础镜像启动一个容器,并进入到容器
    2. 在容器里面做配置操作: 安装基础命令—>配置运行环境—>安装服务和配置服务—>放入业务程序代码
    3. 提交为一个新镜像 docker commit
    4. 基于自己的的镜像创建容器并测试访问 ```bash 1.下载并运行镜像,在容器中做配置 docker run —name b1 -it busybox mkdir /data/html -p echo http-website-in-docker > /data/html/index.html exit

2,提交新镜像 docker commit -a “zhuyy” -c ‘CMD /bin/httpd -f -h /data/html’ -c “EXPOSE 80” b1 httpd-busybox:v1.0

3.利用新镜像启动容器 docker run -d -P —name http01 httpd-busybox:v1.0 docker port httpd01 docker inspect -f “{{.NetworkSettings.Networks.bridge.IPAddress}}” http01 docker inspect -f “{{.Config.Cmd}}” http01

访问:http://10.0.0.15:32769/

  1. **制作nginx镜像**
  2. ```bash
  3. docker pull centos:centos7.7.1908
  4. docker run -it centos:centos7.7.1908 bash
  5. 1.修改时区
  6. rm -f /etc/localtime
  7. ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  8. yum -y install wget
  9. rm -rf /etc/yum.repos.d/*
  10. 2.更改yum源
  11. wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/Centos-7.repo
  12. wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/repo/epel-7.repo
  13. 3,安装相关软件和工具
  14. yum install nginx –y
  15. yum install -y vim curl iproute net-tools
  16. rm -rf /var/cache/yum/*
  17. 4,修改服务配置信息,关闭服务后台运行
  18. vim /etc/nginx/nginx.conf
  19. user nginx;
  20. daemon off; #关闭后台运行
  21. 5.准备程序和数据
  22. rm -f /usr/share/nginx/html/index.html
  23. echo "Nginx Page in Docker" > /usr/share/nginx/html/index.html
  24. 6.不关闭容器的情况,将容器提交为镜像
  25. docker commit -a "zyy" -m "nginx-yum-v1" -c "EXPOSE 80 443" 68843f1c7e71 centos7-nginx:v1
  26. 7.从制作的镜像启动容器
  27. docker run -d -p 8888:80 --name zyy-nginx centos7-nginx:v1 /usr/sbin/nginx

Dockerfile批量构建镜像—docker build

dockerfile 官方说明: https://docs.docker.com/engine/reference/builder/
Dockerfile 构建过程

  • 从基础镜像运行一个容器;
  • 执行一条指令,对容器做出修改
  • 执行类似 docker commit 的操作,提交一个新的中间镜像层(可以利用中间层镜像创建容器进行调试和排错)
  • 再基于刚提交的镜像运行一个新容器
  • 执行 Dockerfile 中的下一条指令,直至所有指令执行完毕

FROM: 指定基础镜像
LABEL: 指定镜像元数据,如: 镜像作者等。docker inspect 命令可以查看LABEL
COPY: 复制文本;复制本地宿主机的到容器中的。一般用于将在宿主机上事先准备的配置文件复制到镜像中
ADD: 复制和解包文件。该命令可认为是增强版的COPY,不仅支持COPY,还支持解压缩。
RUN: 执行shell命令,用来在构建镜像阶段需要执行FROM 指定镜像所支持的Shell命令(docker build)
ONBUILD: 子镜像引用父镜像的指令,可以用来配置当构建当前镜像的子镜像时,会自动触发执行的指令,但在当前镜像构建时,并不会执行
.dockerignore文件:生成构建上下文时Docker客户端应忽略的文件和文件夹指定模式
————————————————————————————————————————————————————-
CMD: 容器启动命令;如果用户启动容器时用docker run指定运行的命令则会覆盖CMD指定的命令(docker run)
ENTRYPOINT: 入口点,功能类似于CMD,配置容器启动后默认执行的命令及参数。ENTRYPOINT 不能被 docker run 提供的参数覆盖,而是追加。Dockerfile中既有CMD也有ENTRYPOINT,那么CMD的全部内容会作为ENTRYPOINT的参数。通常利用ENTRYPOINT指令配合脚本,可以为CMD指令提供环境配置
VOLUME: 挂载点,在容器中创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等,默认会将宿主机上的目录挂载至VOLUME 指令指定的容器目录。即使容器后期被删除此宿主机的目录仍会保留,实现容器数据持久保存。宿主机目录:/var/lib/docker/volumes/<id>/_data(实现的是匿名数据卷,无法指定宿主机路径和容器目录挂载关系 )
EXPOSE: 指定默认的暴露端口,可以通过docker run -P 进行真正暴露 。仅仅是声明容器打算使用什么端口而已,并不会真正暴露端口,即不会自动在宿主进行端口映射,因此,在启动容器时需要通过 -P 或 -p ,Docker主机才会真正分配一个端口转发到指定暴露的端口才可使用。
————————————————————————————————————————————————————-
ARG: 构建参数。在build 阶段指定变量,和ENV不同的是,容器运行时不会存在这些环境变量
WORKDIR: 指定工作目录,为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录,当容器运行后,进入容器内的默认目录
ENV: 设置环境变量;可以定义环境变量和值,会被后续指令(如:ENV,ADD,COPY,RUN等)通过$KEY或${KEY}进行引用
USER: 指定当前用户,指定运行容器的用户名或 UID,在后续dockerfile中的 RUN ,CMD和ENTRYPOINT指令时使用此用户
HEALTHCHECK: 健康检查,检查容器的健康性
STOPSIGNAL: 退出容器的信号

#按照业务类型或系统类型等方式划分创建目录环境,方便后期镜像比较多的时候进行分类
mkdir /data/dockerfile/{web/{nginx,apache,tomcat,jdk},system/{centos,ubuntu,alpine,debian}} -p

FROM ubuntu:18.04
LABEL maintainer="zhuyuany"
ENV version=1.18.0
ADD nginx-$version.tar.gz /usr/local/
RUN cd /usr/local/nginx-$version && ./configure --prefix=/apps/nginx && make && make install && rm -rf /usr/local/nginx* && sed -i 's/.*nobody.*/user nginx;/'
/apps/nginx/conf/nginx.conf && useradd -r nginx
COPY index.html /apps/nginx/html
VOLUME ["/apps/nginx/html"]
EXPOSE 80 443
CMD ["-g","daemon off;"]    #这两条指令相当于ENTRYPOINT ["/apps/nginx/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/apps/nginx/sbin/nginx"]
ONBUILD ADD . /app/src
HEALTHCHECK --interval=5s --timeout=3s --retries=2 CMD curl -fs http://localhost/

构建镜像:docker build -t nginx:v1 -f /usr/local/src/nginx -q
--force-rm #总是删除中间层容器,创建镜像失败时,删除临时容器    
--no-cache #不使用之前构建中创建的缓存
--rm=true #创建镜像成功时,删除临时容器

查看镜像的构建历史:docker history 镜像ID

结合脚本

[root@ubuntu1804 dockerfile]#cat Dockerfile
FROM ubuntu:18.04
LABEL maintainer="zhuyuany"
RUN apt update \
&& apt -y install curl \
&& rm -rf /var/lib/apt/lists/*
ENV ROOT /data/website
COPY index.html ${ROOT}/index.html
CMD /bin/httpd -f -h ${ROOT}
EXPOSE 80

[root@ubuntu1804 dockerfile]#cat build.sh
#!/bin/bash
TAG=$1
docker build -t test:$TAG

构建nginx镜像

FROM centos
LABEL maintainer="zhuyuany"
RUN yum -y install nginx \
&& rm -rf /usr/share/nginx/html/* \
&& echo "<h1> docker test nginx </h1>" > /usr/share/nginx/html/index.html
CMD ["-g","daemon off;"]
ENTRYPOINT ["nginx"]
EXPOSE 80
HEALTHCHECK --interval=5s --timeout=3s --retries=2 CMD curl -fs http://localhost/

docker build -t  nginx:v1 --force-rm --rm .
docker run -d -p 8080:80 --name nginx-1.0 nginx:v2

🔣数据管理

容器的数据分层
LowerDir: image 镜像层(镜像本身,只读)
UpperDir: 容器的上层(读写) ,容器变化的数据处在此处
MergedDir: 容器的文件系统,使用Union FS(联合文件系统)将lowerdir 和 upperdir 合并给容器使用
WorkDir: 容器在宿主机的工作目录

数据卷

启动容器时,可以指定使用数据卷实现容器数据的持久化
指定宿主机目录或文件: 指定宿主机的具体路径和容器路径的挂载关系,此方式不会自动创建数据卷
匿名卷: 不指定数据名称,只指定容器路径,docker自动指定宿主机的路径,此方式会创建匿名数据卷,Dockerfile中VOLUME指定的卷即为匿名卷
命名卷: 指定数据卷的名称和容器路径的挂载关系,此方式会创建命名数据卷

docker run -d --name nginx-test -p 8888:80 -v /root/test:/usr/share/nginx/html/ nginx:v1
echo docker-volume-test > /root/test/index.html

docker run -d --name nginx-test -p 8888:80 -v /usr/share/nginx/html/ nginx:v1
echo docker-volume-test2 >/var/lib/docker/volumes/7e9e6a4ed3...37f2de081/_data/index.html

docker run -d --name nginx-test -p 8888:80 -v voll-test:/usr/share/nginx/html/ nginx:v1
echo docker-volume-test3 > /var/lib/docker/volumes/voll-test/_data/index.html

docker inspect --format="{{.Mounts}}" <容器ID>        #查看数据卷的挂载关系

数据卷容器

1.先启动一个挂载宿主机的数据目录的容器server,数据卷容器一般无需映射端口
2.启动多个数据卷容器Client。----复制Server容器的数据卷信息

docker run -d --name volume-server -v voll-test:/usr/share/nginx/html/:ro nginx:v1
docker run -d --name c1 --volumes-from volume-server -p 8888:80 nginx:v1
docker run -d --name c2 --volumes-from volume-server -p 9999:80 nginx:v1

数据卷容器的功能只是将数据挂载信息传递给了其它使用数据卷容器的容器,而数据卷容器本身并不提供数据存储功能。删除数据卷容器后,旧的client容器仍能访问,但无法再创建基于数据卷容器的新的client容器,但可以创建基于已创建的client容器的Client容器。

🔣网络管理

image.png
默认情况下

  • 同一个宿主机的不同容器可相互通信 dockerd --icc=false 可以禁止通信
  • 不同宿主机之间的容器IP地址重复,不能相互通信

    同一个宿主机不同容器间禁止通信—icc

    ```bash vim /lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H fd:// —containerd=/run/containerd/containerd.sock —icc=false

systemctl daemon-reload;systemctl restart docker

<a name="mmHf1"></a>
### 修改默认docker0网桥的网络配置--bip
```bash
#方法1
vim /etc/docker/daemon.json
{
"bip": "192.168.100.1/24",
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"]
}

systemctl restart docker.service

#方法2
vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=192.168.100.1/24

systemctl daemon-reload;systemctl restart docker

#注意两种方法不可混用,否则将无法启动docker服务

修改默认网络设置使用自定义网桥-b

brctl addbr br0
ip a a 192.168.100.1/24 dev br0

vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b br0

systemctl daemon-reload;systemctl restart docker

容器名称互联

通过docker run --link 会自动将第一个主机的名称加入/etc/hosts文件,从而可以利用第一个容器名称进行访问

docker run --name <容器名称> #先创建指定名称的容器
docker run --link <目标通信的容器ID或容器名称> #再创建容器时引用上面容器的名称。
docker run --name <容器名称> --link <目标容器名称>:"<容器别名1> <容器别名2> ..."

docker run -d --name c1 -p 8888:80 nginx:v1
docker run -d --name c2 --link c1 -p 9999:80 nginx:v1
docker run -d --name c3 --link c1:c1-alias -p 9999:80 nginx:v1

网络连接模式★

Docker 的网络支持5种网络模式:

  • none 无网络供能
  • bridge 默认,可以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问。需要启动ip_forward功能
  • host 新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址。访问容器的时候直接使用宿主机IP+容器端口
  • container 此模式创建的容器需指定和一个已经存在的容器共享一个网络
  • network-name 自定义网络模式,实现不同集群应用的独立网络管理,而互不影响,而且在网一个网络内,可以直接利用容器名相互访问 ```bash bridge网络模式特点 网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络 无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改 可访问外网: 利用宿主机的物理网卡,SNAT连接外网 外部主机无法直接访问容器: 可以通过配置DNAT接受外网的访问 低性能较低: 因为可通过NAT,网络转换带来更的损耗 端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容

Host 网络模式特点: 使用参数 —network host 指定 共享宿主机网络 网络性能无损耗 网络故障排除相对简单 各容器网络无隔离 网络资源无法分别统计 端口管理困难: 容易产生端口冲突 不支持端口映射

none模式特点 使用参数 —network none 指定 默认无网络功能,无法和外部通信 无法实现端口映射 适用于测试环境

Container模式特点 使用参数 –-network container:名称或ID 指定 与宿主机网络空间隔离 空器间共享网络空间 适合频繁的容器间的网络通信 直接使用对方的网络,较少使用

创建自定义网络 docker network create -d —subnet —gateway <网关> <自定义网络名称>
docker network inspect <自定义网络名称或网络ID> docker run —network <自定义网络名称> <镜像名称> doccker network rm <自定义网络名称或网络ID>

注意:mode不支持host和none,默认是bridge模式

<a name="gyDhg"></a>
### 同一个宿主机之间不同网络的容器通信
![image.png](https://cdn.nlark.com/yuque/0/2022/png/12467445/1641468549475-009c8078-fbb8-49b1-8351-52050b4b961c.png#clientId=u960c9afa-5858-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=279&id=u238fe17f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=756&originWidth=1139&originalType=binary&ratio=1&rotation=0&showTitle=false&size=285906&status=done&style=none&taskId=u5a0e6491-47f1-4e0a-8422-52dc368a789&title=&width=420.5)
```bash
开两个容器,一个使用自定义网络容器,一个使用默认brideg网络的容器,默认无法通信,利用单臂路由实现通信

默认网络和自定义网络是两个不同的网桥
可以使用docker network connect命令实现同一个宿主机不同网络的容器间相互通信

docker network connect test-net test1        #在test1容器中可以看到新添加了一个网卡,并且分配了test-net网络的IP信息
docker network connect bridge test2            #将自定义网络中的容器test2也加入到默认网络中
docker network disconnect test-net test1        #断开通信

跨宿主机的容器之间网络互联

实现原理: 是在宿主机做一个网络路由就可以实现A宿主机的容器访问B主机的容器的目的
image.png

Docker默认网段是172.17.0.x/24,而且每个宿主机都是一样的,因此要做路由的前提就是各个主机的网络不能一致
在各宿主机添加静态路由,网关指向对方宿主机的IP
route add -net 192.168.200.0/24 gw 10.0.0.102
iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
iptables -P FORWARD ACCEPT

🔣单机编排之Docker Compose

github地址: https://github.com/docker/compose
官方地址: https://docs.docker.com/compose/

#通过pip下载
apt -y install python3-pip
apt -y install docker-compose

#直接从github上下载离线安装
curl -L https://github.com/docker/compose/releases/download/1.25.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
mkdir /data/docker-compose
vim docker-compose.yml
service-nginx-web1:
 image: nginx:v1
 container_name: c1
 expose:
  - 80
  - 443
 ports:
  - "8888:80"
  - "443:443"
service-nginx-web2:
 image: nginx:v1
 container_name: c2
 ports:
  - "9999:80"

docker-compose config -q
docker-compose up    -d                    在docker-compose.yml文件所在目录运行
docker-compose ps                            前台执行
docker-compose start                    后台执行
docker-compose kill                    相当于stop
docker-compose rm
docker-compose events
docker-compose pause/unpause

docker-compose up -d --scale service-nginxweb=2            #启动多个容器
docker-compose up -d --scale service-nginxweb=3 --scale service-tomcat=2
docker-compose scale service-nginx-web=3        #扩容,单机无意义
docker-compose scale service-nginx-web=0        #缩容

🔣仓库管理

公有云仓库: 由互联网公司对外公开的仓库
私有云仓库: 组织内部搭建的仓库,一般只为组织内部使用,常使用下面软件搭建仓库

  • docker registory :docker 官方提供
  • docker harbor:VMware 提供

官方网址: https://goharbor.io/
下载地址: https://github.com/vmware/harbor/releases
安装文档: https://github.com/goharbor/harbor/blob/master/docs/install-config/_index.md
image.png

安装harbor

安装docker
安装docker-compose
下载habor离线包,编辑配置文件harbor.cfg
安装python环境,运行安装脚本/apps/harbor/install.sh
实现开机自动启动 harbor
用浏览器访问: http://10.0.0.5

wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.6.tgz
mkdir /apps
tar xvf harbor-offline-installer-v1.7.6.tgz -C /apps/
vim /apps/harbor/harbor.cfg
hostname = 10.0.0.10                                                  #指向当前主机IP 或 FQDN
ui_url_protocol = http                                                 #默认为http, 如果修改为https,需要指定下面证书路径
ssl_cert = /data/cert/server.crt                             #https时,需指定下面证书文件路径
ss_cert_key = /data/cert/server.key                     #https时,需指定下面私钥文件路径
harbor_admin_password = 123456                                 #指定harbor登录用户admin的密码,默认用户/密码:admin/Harbor12345

apt -y install python
/apps/harbor/install.sh

vim /lib/systemd/system/harbor.service                                                    方法1: 通过service文件实现开机自启动
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor
[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml up
ExecStop=/usr/bin/docker-compose -f /apps/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
systemctl daemon-reload;systemctl enable harbor

vim /etc/rc.local                                                                                            方法2: 通过 rc.local实现
#!/bin/bash
cd /apps/harbor
/usr/bin/docker-compose up
chmod +x /etc/rc.local

web界面:http://10.0.0.5

在客户端主机上命令行登录harbor

vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.15 --insecure-registry 10.0.0.5

vim /etc/docker/daemon.json                                                                                    #或者修改下面文件
{
"registry-mirrors": ["https://si7y70hh.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.5:80","10.0.0.15:80"] #:80可省略
}

systemctl daemon-reload;systemctl restart docker
docker login 10.0.0.5                    #上传镜像前,必须先登录harbor,登录信息存放在.docker/config.json        

docker tag nginx:v2 10.0.0.5/test/nginx:v2
docker push 10.0.0.5/test/nginx:v2                                #上传镜像到harbor仓库

docker pull 10.0.0.5/test/nginx:v2                                #在另一客户端拉取镜像

实现高可用—-双向复制

第二台harbor上新建项目
仓库管理中新建目标
复制管理中新建复制规则