docker入门

历史演化

物理机时代 —> 虚拟化时代 —> 容器化时代

物理机时代

部署非常慢

成本很高

资源浪费

难于扩展与迁移

受制于硬件

虚拟化时代

多部署

资源池

资源隔离

很容易扩展

VM需要安装操作系统

容器化时代

容器架构降低了硬件成本

更快速的部署开发/测试/生产环境

更简便的维护开发/测试/生产环境

与微服务架构更为契合

容器化技术的应用场景

标准化的迁移方式

统一的参数配置

自动化部署

应用集群监控

开发与运维之间的沟通桥梁

虚拟化与容器化对比

虚拟化与容器化架构图

左图是虚拟机

从下到上理解:

  • 基础设施(Infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机
  • 主机操作系统(Host Operating System)
  • 虚拟机管理系统(Hypervisor)。利用Hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V、Xen以及KVM。类型2的Hypervisor有VirtualBox和VMWare workstation。
  • 客户机操作系统(Guest Operating System)。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个客户机操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。
  • 各种依赖。每一个客户机操作系统都需要安装许多依赖。如果你的应用需要连接PostgreSQL的话,则需要安装libpq-dev;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。
  • 应用。安装依赖之后,就可以在各个客户机操作系统分别运行应用了,这样各个应用就是相互隔离的。

右图是容器化

从下到上理解上图:

  • **基础设施(Infrastructure)**。
  • **主操作系统(Host Operating System)**。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。
  • **Docker守护进程(Docker Daemon)**。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。
  • 各种依赖。对于Docker,应用的所有依赖都打包在Docker镜像中,Docker容器是基于Docker镜像创建的。
  • 应用。应用的源代码与它的依赖都打包在Docker镜像中,不同的应用需要不同的Docker镜像。不同的应用运行在不同的Docker容器中,它们是相互隔离的。

什么是docker

一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任 何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口; 使用go语言编写,在LCX(linux容器)基础上进行的封装

1、提供一次性的环境,假如需要安装Mysql,则需要安装很多依赖库、版本等,如果使用Docker则通过镜像就 可以直接启动运行

2、快速动态扩容,使用docker部署了一个应用,可以制作成镜像,然后通过Dokcer快速启动

3、组建微服务架构,可以在一个机器上模拟出多个微服务,启动多个应用

4、更好的资源隔离和共享

开箱即用,快速部署,可移植性强,环境隔离

安装

官网: https://www.docker.com/

文档:https://docs.docker.com/

点击文档连接,点击manuals。点击docker engine。

选择操作系统,并注意版本。

Docker 引擎包现在称为docker-ce.

卸载旧版本

较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。

1
2
3
4
5
6
7
8
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

安装方式

1.使用存储库的安装

2.直接下载包,安装

3.自动化脚本安装

存储库方式安装

在新主机上首次安装 Docker Engine 之前,您需要设置 Docker 存储库。之后,您可以从存储库安装和更新 Docker。

设置存储库

安装yum-utils包(提供yum-config-manager 实用程序)并设置存储库。

1
sudo yum install -y yum-utils

官方源(比较慢)

1
2
3
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

阿里云源

1
2
3
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装Docker Engine

  1. 安装最新版本的 Docker Engine、containerd 和 Docker Compose 或进入下一步安装特定版本:
1
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

如果提示接受 GPG 密钥,请验证指纹是否匹配 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35,如果是,则接受它。

此命令会安装 Docker,但不会启动 Docker。它还会创建一个 docker组,但是默认情况下它不会将任何用户添加到该组中。

  1. 要安装特定版本的 Docker Engine,请在 repo 中列出可用版本,然后选择并安装:

一个。列出并排序您的存储库中可用的版本。此示例按版本号从最高到最低对结果进行排序,并被截断:

1
yum list docker-ce --showduplicates | sort -r

返回的列表取决于启用了哪些存储库,并且特定于您的 CentOS 版本(.el7在本例中由后缀表示)。

通过其完全限定的包名称安装特定版本,即包名称 ( docker-ce) 加上版本字符串(第 2 列),从第一个冒号 ( :) 开始,一直到第一个连字符,用连字符 ( -) 分隔。例如,docker-ce-18.09.1

1
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-compose-plugin

此命令会安装 Docker,但不会启动 Docker。它还会创建一个 docker组,但是默认情况下它不会将任何用户添加到该组中。

  1. 启动 Docker。
1
sudo systemctl start docker
  1. hello-world 通过运行映像来验证 Docker 引擎是否已正确安装。
1
sudo docker run hello-world
  1. 此命令下载测试映像并在容器中运行它。当容器运行时,它会打印一条消息并退出。

这将安装并运行 Docker 引擎。用于sudo运行 Docker 命令。继续Linux 后安装以允许非特权用户运行 Docker 命令和其他可选配置步骤。

升级 Docker 引擎

要升级 Docker Engine,请下载较新的包文件并重复 安装过程,使用yum -y upgrade 代替yum -y install,并指向新文件。

设置开机启动

1
systemctl enable docker

查看版本

1
docker version

查看详细信息

1
docker info

结构图

docker模块图

宿主机(Docker_Host)

在docker中,宿主机也就是“Docker_Host”,是Docker的整体架构之一,可以是物理机也可以是虚拟机,在宿主机上跑着一个dockers服务,使用“docker daemon”可以实现对docker对象生命周期管理。

镜像

镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的“集装箱”

类比为:操作系统的安装光盘

Container(容器)

是镜像的实例,由Docker负责创建,容器之间彼此隔离。

类比为:操作系统

registry

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

一个 Docker Registry 中可以包含多个 仓库Repository);每个仓库可以包含多个 标签Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

Docker Registry 公开服务

Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub (opens new window),这也是默认的 Registry,并拥有大量的高质量的 官方镜像 (opens new window)。除此以外,还有 Red Hat 的 Quay.io (opens new window);Google 的 Google Container Registry (opens new window)Kubernetes (opens new window)的镜像使用的就是这个服务;代码托管平台 GitHub (opens new window)推出的 ghcr.io (opens new window)

由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为 加速器。常见的有 阿里云加速器 (opens new window)DaoCloud 加速器 (opens new window)等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从 Docker Hub 下载速度会提高很多。在 安装 Docker 一节中有详细的配置方法。

国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 网易云镜像服务 (opens new window)DaoCloud 镜像市场 (opens new window)阿里云镜像库 (opens new window)等。

私有 Docker Registry

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry (opens new window)镜像,可以直接使用做为私有 Registry 服务。在 私有仓库 一节中,会有进一步的搭建私有 Registry 服务的讲解。

开源的 Docker Registry 镜像只提供了 Docker Registry API (opens new window)的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,Harbor (opens new window)Sonatype Nexus

镜像操作

查看本地镜像:docker images
搜索镜像:docker search centos
搜索镜像并过滤是官方的: docker search –filter “is-official=true” centos
搜索镜像并过滤大于多少颗星星的:docker search –filter stars=10 centos
下载centos7镜像:docker pull centos:7
修改本地镜像名字(小写):docker tag centos:7 mycentos:1
本地镜像的删除:docker rmi centos:7

配置镜像加速

1
2
3
4
科大镜像:https://docker.mirrors.ustc.edu.cn/
网易:https://hub-mirror.c.163.com/
阿里云:https://<你的ID>.mirror.aliyuncs.com
七牛云加速器:https://reg-mirror.qiniu.com

阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:

1
https://<你的ID>.mirror.aliyuncs.com

编辑文件vi /etc/docker/daemon.json(如果文件不存在请新建该文件)

1
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}

重启:systemctl daemon-reload && systemctl restart docker

容器操作

构建容器:docker run -itd –name=mycentos centos:7
-i :表示以交互模式运行容器(让容器的标准输入保持打开)
-d:表示后台运行容器,并返回容器ID
-t:为容器重新分配一个伪输入终端
–name:为容器指定名称

查看本地所有的容器:docker ps -a
查看本地正在运行的容器:docker ps
停止容器:docker stop CONTAINER_ID / CONTAINER_NAME
一次性停止所有容器:docker stop $(docker ps -a -q)
启动容器:docker start CONTAINER_ID / CONTAINER_NAME
重启容器:docker restart CONTAINER_ID / CONTAINER_NAME
删除容器:docker rm CONTAINER_ID / CONTAINER_NAME
强制删除容器:docker rmi -f CONTAINER_ID / CONTAINER_NAME
查看容器详细信息:docker inspect CONTAINER_ID / CONTAINER_NAME
进入容器:docker exec -it 0ad5d7b2c3a4 /bin/bash

容器与宿主机操作

容器与宿主机端口映射

1
docker run -p 宿主机端口:容器端口  镜像名

容器与宿主机之间文件复制与挂载

从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径
docker cp /root/123.txt mycentos:/home/
从容器复制到宿主机:docker cp 容器名字/ID:容器路径 宿主机本地路径
docker cp mycentos:/home/456.txt /root
宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 镜像ID
docker run -itd -v /root/xdclass/:/home centos:7

commit构建自定义镜像

对容器的修改以及保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
启动并进入容器:docker run -it centos:7 /bin/bash
在/home 路径下创建xdclass文件夹:mkdir /home/xdclass
安装ifconfig命令:yum -y install net-tools
重启容器,查看容器的xdclass文件夹还在不在:docker restart 67862569d4f7
删除容器,再重新启动一个容器进入查看有没有xdclass文件夹:docker rm 67862569d4f7 && docker
run -it centos:7 /bin/bash
构建镜像:
docker commit 4eb9d14ebb18 mycentos:7
docker commit -a "XD" -m "mkdir /home/xdclass" 4eb9d14ebb18 mcentos:7
-a:标注作者
-m:说明注释
查看详细信息:docker inspect 180176be1b4c
启动容器:docker run -itd 180176be1b4c /bin/bash
进入容器查看:docker exec -it 2a4d38eca64f /bin/bash

Dockerfile构建镜像

Dockerfile文件

1
2
3
4
5
6
7
# this is a dockerfile
FROM centos:7
MAINTAINER XD 123456@qq.com
RUN echo "正在构建镜像!!!"
WORKDIR /home/xdclass
COPY 123.txt /home/xdclass
RUN yum install -y net-tools

构建:docker build -t mycentos:v2

1
docker build -t 机构/镜像名<:tags> Dockerfile目录

查看:docker images
进入验证:验证成功

Dockerfile基础指令

FROM
基于哪个镜像
MAINTAINER
注明作者
COPY
复制文件进入镜像(只能用相对路径,不能用绝对路径)
ADD
复制文件进入镜像(假如文件是.tar.gz文件会解压)
WORKDIR:
指定工作目录,假如路径不存在会创建路径
ENV
设置环境变量
EXPOSE
暴露容器端口
RUN

​ 在构建镜像的时候执行,作用于镜像层面

ENTRYPOINT
在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
CMD
在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
容器启动后执行默认的命令或者参数,允许被修改
命令格式:
shell命令格式:RUN yum install -y net-tools
exec命令格式:RUN [ “yum”,”install” ,”-y” ,”net-tools”]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#第一个
FROM centos:7
RUN echo "images building!"
CMD ["echo","container","starting..."]
ENTRYPOINT ["echo","container","starting !!!"]

#第二个
FROM centos:7
RUN echo "images building!"
CMD ["echo","containe1r","starting..."]
CMD ["echo","container2","starting..."]
ENTRYPOINT ["echo","container2","starting !!!"]
ENTRYPOINT ["echo","container2","starting !!!"]

#第三个
FROM centos:7
CMD ["-ef"]
ENTRYPOINT ["ps"]

Dockerfile构建tomcat

本地宿主机配置jdk

vi /etc/profile

1
2
3
4
export JAVA_HOME=/usr/local/jdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

source /etc/profile
检验:java -version

Dockerfile文件

1
2
3
4
5
6
7
8
9
10
11
FROM centos:7
ADD jdk-8u211-linux-x64.tar.gz /usr/local
RUN mv /usr/local/jdk1.8.0_211 /usr/local/jdk
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local
RUN mv /usr/local/apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

启动容器

1
2
docker run -itd -p 80:8080 -v /root/test/ROOT:/usr/local/tomcat/webapps/ROOT
mycentos:jdk /bin/bash

Dockerfile构建

Dockerfile文件

1
2
3
4
5
FROM centos:7
ADD nginx-1.16.0.tar.gz /usr/local
COPY nginx_install.sh /usr/local
RUN sh /usr/local/nginx_install.sh
EXPOSE 80

安装nginx的shell脚本

1
2
3
4
#!/bin/bash
yum install -y gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
cd /usr/local/nginx-1.16.0
./configure --prefix=/usr/local/nginx && make && make install

制作Nginx镜像

​ docker build -t mycentos:nginx .

Nginx镜像启动注意

​ 在容器里nginx是以daemon方式启动,退出容器时,nginx程序也会随着停止:
​ /usr/local/nginx/sbin/nginx
​ 使用前台方式永久运行:/usr/local/nginx/sbin/nginx -g “daemon off;”

运行:

docker run -itd -p 80:80 mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”

镜像分层

1.构建测试镜像v1.0:docker build -t image_test:1.0 .

1
FROM alpine:3.15.0 #除了继承基础镜像,啥也不做

2.构建测试镜像v2.0:docker build -t image_test:2.0 .

1
2
FROM alpine:3.15.0
RUN dd if=/dev/zero of=file1 bs=10M count=1 #添加一个10M的文件file1

3.构建测试镜像v3.0:docker build -t image_test:3.0 .

1
2
3
FROM alpine:3.15.0
RUN dd if=/dev/zero of=file1 bs=10M count=1 #添加一个10M的文件file1
RUN dd if=/dev/zero of=file2 bs=10M count=1 #添加一个10M的文件file2

使用docker history可以看到镜像的构建历史。
我们每一行列出了镜像包含的层。

使用docker history我们看到有一行很特别,就是镜像ID为的行,这一行是什么呢?
看了 官方文档 的描述,我们知道这些构建步骤要么是构建在另一个系统,要么是镜像的部分是从DockerHub上拉取下来的,要么是使用的是另一种构建工具BuildKit构建的。
很显然,我们这里就是第二种情况,因为我们的Dockerfile中第一句指令就是FROM alpine:3.15.0.

镜像分层

从上面的图可以看到,我们的镜像是分层的,我们的Dockerfile中新增一条指令,就会新增一层!
如果我们将多个命令合成一个,那么也只会生成一层。修改一下上面的image_test:3.0,把两条RUN合并成一条

如果我们将多个命令合成一个,那么也只会生成一层。修改一下上面的image_test:3.0,把两条RUN合并成一条:

1
2
3
FROM alpine:3.15.0
RUN dd if=/dev/zero of=file1 bs=10M count=1 && \
dd if=/dev/zero of=file2 bs=10M count=1

使用docker history 查看image_test:4.0,可以看到,只有2层了!

镜像分层的好处

  • 拉取更快:因为分层了,只需拉取本地不存在的层即可!
  • 存储更少:因为共同的层只需存储一份即可!
  • 运行时存储更少:容器运行时可以共享相同的层!

docker网络模式与通信

默认的三种网络模式:
bridge:桥接模式
host:主机模式
none:无网络模式
查看网络模式:
docker network ls

网络模式

桥接模式

桥接模式是docker 的默认网络设置,当Docker服务启动时,会在主机上创建一个名为docker0的虚拟网桥,并
选择一个和宿主机不同的IP地址和子网分配给docker0网桥

安装工具:
yum -y install net-tools
yum install -y bridge-utils

查看桥接情况:
brctl show

host模式

该模式下容器是不会拥有自己的ip地址,而是使用宿主机的ip地址和端口。

启动nginx容器命令并防火墙放开80端口:
docker run -d –net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
firewall-cmd –zone=public –add-port=80/tcp –permanent
firewall-cmd –reload

none模式

none模式:关闭模式
无法连外网

Docker 容器间基于Link实现单向通信

启动mysql数据库容器:
docker run –name mydb -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:5.7
启动tomcat应用容器并link到mysql数据库:
docker run -itd –name tomcat1 –link mydb tomcat:tag注意:mydb 这个容器一定要存在!
官方版的mysql 5.7 需要安装工具才有ping命令:
apt-get update && apt-get install iputils-ping

Docker容器间利用brige网桥实现双向通信

执行:docker network ls

创建一个新的网桥:docker network create -d bridge my_bridge
启动第一个容器:docker run -itd –name tomcat centos:7
启动第二个容器:docker run -itd –name redis centos:7
把第一个容器加入网桥:docker network connect my_bridge tomcat
把第二个容器加入网桥:docker network connect my_bridge redis
最后分别进入俩个容器中进行验证

特权模式

启动一个普通的容器
docker run -itd –name mycentos centos:7 /bin/bash
安装网络工具:
yum -y install net-tools
执行route -n
删除网关:
route del default gw 172.17.0.1
启动拥有特权模式的容器:

docker run -itd –privileged=true –name mycentos1 centos:7 /bin/bash
进入容器:
docker exec -it ef /bin/bash
删除网关
route del default gw 172.17.0.1
成功
备注:特权模式用的比较少

Volume数据共享

dockerfile

1
2
FROM centos:7
VOLUME ["/usr/local"]

注意:在dockerfile里设置volume是无法修改宿主机的挂载路径的

使用volume容器共享创建nginx集群
使用–volumes-from 实现容器与容器之间volume共享
创建nginx1
docker run -itd -p 8080:80 -v /usr/local/nginx/html:/usr/local/nginx/html –name nginx1
mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
创建nginx2
docker run -itd -p 8081:80 –volumes-from nginx1 –name nginx2 mycentos:nginx
/usr/local/nginx/sbin/nginx -g “daemon off;”
创建nginx3
docker run -itd -p 8082:80 –volumes-from nginx1 –name nginx3 mycentos:nginx
/usr/local/nginx/sbin/nginx -g “daemon off;”
对/usr/local/nginx/html/index.html进行修改
打开浏览器进行访问测试
使用docker inspect 容器ID 可以查看详细的挂载信息

Docker-Compose

docker-compose:是一个用于定义和运行多容器 Docker 的应用程序工具,可以帮助我们可以轻松、高效的管理容器.

查看docker-compose版本:(docker-compose version 老版本的)
docker compose version

运行WordPress

https://docs.docker.com/samples/wordpress/

  1. 创建一个空的项目目录。
  2. 切换到您的项目目录。
  3. 创建docker-compose.yml
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
services:
db:
# We use a mariadb image which supports both amd64 & arm64 architecture
image: mariadb:10.6.4-focal
# If you really want to use MySQL, uncomment the following line
#image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:

构建:

docker compose up -d

在浏览器中打开wordPress http://localhost:8000

关闭和清理

该命令docker compose down会删除容器和默认网络,但会保留您的 WordPress 数据库。

该命令docker compose down --volumes删除容器、默认网络和 WordPress 数据库。

compose命令

compose操作容器(一定要进入配置文件目录)
后台启动容器:docker compose up -d
查看容器运行情况:docker compose ps
停止并删除容器:docker compose down
停止并删除容器并删除volume:docker compose down –volumes
停止启动容器:docker-compose stop;docker-compose start
docker-compose exec的使用:docker-compose exec redis bash

docker-compose.yml

docker-compose.yml的三大部分:version,services,networks,最关键是services和networks两个部分
compose设置网络模式
compose使用端口映射
compose设置文件共享
compose管理多个容器

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'
services:
nginx:
image: mycentos:nginx
network_mode: "host"
volumes:
- /home:/usr/local/nginx/html
- /var/logs/nginx/logs:/usr/local/nginx/logs
command: /usr/local/nginx/sbin/nginx -g "daemon off;"
redis:
image: mycentos:redis
ports:
- "6380:6379"

阿里云镜像仓库

https://cr.console.aliyun.com/cn-shanghai/instances/repositories

harbor仓库

搭建

安装 yum -y install openssl

下载 https://github.com/goharbor/harbor/releases

上传对应安装包
修改配置:harbor.yml
修改主机名(注意空格):hostname: 192.168.0.151
修改密码(注意空格):harbor_admin_password: Harbor12345

执行脚本:sh prepare

执行安装命令:sh install.sh
执行命令:docker-compose ps
访问Harbor,默认用户名admin
关闭:docker-compose down
启动:docker-compose up -d

配置与使用harbor仓库

Docker配置使用自建仓库
默认docker只允许访问 https仓库
如果要访问http仓库需要自己配置
配置允许访问http仓库:/etc/docker/daemon.json

1
2
3
{ 
"insecure-registries":["http://192.168.0.151"]
}

重启docker服务:systemctl restart docker.service
网页上创建项目名
登录:docker login –username=admin 192.168.0.151
改名:docker tag mysql:5.7 192.168.0.151/xx/mysql:5.7
推送:docker push 192.168.0.151/xx/mysql:5.7
下载:docker pull 192.168.0.151/xx/mysql:5.7
docker login 后有一个登录凭证(可删除,下次需要密码):
/root/.docker/config.json (建议从安全角度出发,每次登录后进行删除)

镜像的本地载入载出

两种办法:

保存镜像
保存容器

保存镜像:
docker save cd3ed0dfff7e -o /home/mysql.tar
docker save mysql:5.7 > /home/mysql.tar
载入镜像:
docker load -i mysql.tar
保存容器:
docker export 974b919e1fdd -o /home/mysql-export.tar
载入容器:
docker import mysql-export.tar


docker入门
http://hanqichuan.com/2022/08/10/devops/docker入门/
作者
韩启川
发布于
2022年8月10日
许可协议