Docker

介绍

  • Docker的英文本意是“搬运工”,在程序员的世界里,Docker搬运的是集装箱(Container),集装箱里装的是任意类型的App,开发者通过Docker可以将App变成一种标准化的、可移植的、自管理的组件,可以在任何主流系统中开发、调试和运行。最重要的是,它不依赖于任何语言、框架或系统。

  • 目标是实现轻量级的操作系统虚拟化解决方案

  • 基础:Linux 容器( LXC)

  • Go 语言实现

Docker组成

Docker Images:Docker image 是 Docker container 最基本的模板。image 通过容器使系统和应用易于安装,Docker image 是用来运行的容器,可以在 https://hub.docker.com/找到许多 images 。

Docker Registry:Docker registry 是为 Docker images 提供的库。它提供了公共和私有库。公共 Docker 库被叫做 Docker Hub。这里我们能够上传 push 和 pull 我们自己的 images。

Docker Container:Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的(Image是只读的)。Docker 是一个联合的文件系统作为容器后台,容器的任何变化,都将被保存在一个基本 image 新的层上。我们安装应用程序的层就是容器。每个在主机上运行的容器都是独立的,因此,提供了一个安全的应用平台。

虚拟机和容器的区别

虚拟化

01-虚拟化技术

容器化技术

02-容器化技术

虚拟化技术和容器技术性能对比

特性 虚拟机 容器
硬盘空间 GB级别 MB级别
启动 分钟级 秒级
资源消耗 很大,单机一般几十个VM,硬盘使用一般为GB 很小,单机支持上千个容器,硬盘使用一般为MB
隔离性
镜像大小 几百MB到几G 可小至几MB
性能 通过对硬件层的模拟,增加了系统调用链路的环节,有性能损耗 共享内核,接近原生,几乎没有性能损耗
系统覆盖 Linux、Windows、Mac 内核所支持的OS

Docker应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

CentOS 7安装Docker-CE社区版

前言

在安装 Docker 之前,先说一下配置,我这里是Centos7 Linux 内核:官方建议 3.10 以上,3.8以上貌似也可。

注意:本文的命令使用的是 root 用户登录执行,不是 root 的话所有命令前面要加 sudo

查看当前内核版本

1
2
[lilbai@localhost ~]$ uname -r
3.10.0-1160.el7.x86_64

01查看Linux内核

更新yum包(这个命令不是必须的)

生产环境中此步操作需慎重,看自己情况,学习的话随便搞

1
2
yum -y update:升级所有包同时也升级软件和系统内核;​ 
yum -y upgrade:只升级所有包,不升级软件和系统内核

卸载旧版本的docker

如果你确信你的Linux 没装过docker,那么可以不执行这条命令

1
yum remove docker  docker-common docker-selinux docker-engine

安装docker依赖yum-utils

1
yum install -y yum-utils device-mapper-persistent-data lvm2

03安装docker依赖

04安装依赖完成

设置yum源(二选一)

设置一个yum源,第一个是Docker官方的yum仓库,第二个是阿里云的yum仓库

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

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

05设置yum的repo

查看docker版本有那些

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

06查看docker版本有哪些

选择一个版本安装

1
yum -y install docker-ce-18.03.1.ce

07安装docker-ce

安装成功

出现下入说明已经安装成功了

07安装成功

设置开机启动docker

刚安装完的docker是还没启动的,需要启动才能执行docker命令

1
systemctl start docker

设置开机不启动docker

1
systemctl enable docker

Ubuntu18.04安装Docker-CE社区版

本次安装环境在华为服务器Ubuntu安装Docker

因为Ubuntu官方系统里自带的Docker版本不是最新的,为了安装最新版本,我们要从官方Docker库里下载,为此,需要先添加几个包源,添加GPG公钥来确保下载和安装的有效性。

更新现有包列表

1
sudo apt update

安装几个依赖包,让apt可以支持HTTPS

1
sudo apt -y install apt-transport-https ca-certificates curl software-properties-common

将官方Docker库的GPG公钥添加到系统中

1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

将Docker库添加到APT里

1
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"

再次更新现有包列表

1
sudo apt update

查看Docker库的版本

为了确保修改生效,让新的安装从Docker库里获取,而不是从Ubuntu自己的库里获取

1
apt-cache policy docker-ce

可能会看到如下图的输出,各个系统的情况可能略有不同

输出显示,docker-ce(ce是社区版的意思)还没有安装

开始安装

本次实验默认安装最新版Docker,如果你想执行下载某个版本,可以通过在软件包名后面添加版本=来指定安装版本,比如指定安装5.20.10.6~3-0,则安装指令为:

sudo apt -y install docker-ce=<5:20.10.7~3-0~ubuntu-focal> docker-ce-cli=<5:20.10.7~3-0~ubuntu-focal> containerd.io

1
sudo apt -y install docker-ce docker-ce-cli containerd.io

安装这三个程序的作用:

  • docker-ce:Docker守护进程,这是执行所有管理工作的部分,在Linux上需要另外两个守护进程。
  • docker-ce-cli:CLI工具来控制守护程序,如果要控制远程Docker守护程序,你也可以单独安装它们。
  • containerd.io:守护进程与OS API连接,从本质上将Docker与OS分离,还为非Docker容器管理器提供容器服务。

查看运行状态

现在Docker应该已经安装好了,守护进程也开启了,开机启动也开启了。我们看看Docker的运行状态吧

1
systemctl status docker

你看到的输出应该是这样的

到这里就安装成功啦

设置开启自启Docker

docker自启动(开机自启)

1
systemctl enable docker.service

关闭开机自动启动

1
systemctl disable docker.service

查看开机启动的程序

查看开机启动的程序中是否有docker

1
systemctl list-unit-files | grep enable

安装docker-compose

安装环境:CentOS 7

[root@localhost]# uname -r
3.10.0-1160.el7.x86_64

方式一:官网方式

下载docker-compose

1
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

下载过程出错

如果出现以下错误,是标识连接失败的意思,重新下载即可,下载地址在GitHub上面,国内下载是稍微有点问题。

1
curl: (35) TCP connection reset by peer

添加可执行权限

1
sudo chmod +x /usr/local/bin/docker-compose

查看版本

1
docker-compose --version

方式二:pip方式安装

安装pip

1
2
yum -y install epel-release
yum -y install python-pip

查看pip版本

1
pip --version

更新pip

1
pip install --upgrade pip

安装docker-compose

1
pip install docker-compose 

查看docker-compose版本

1
docker-compose version

方式三:手动安装

下载docker-compose

1
wget https://github.com/docker/compose/releases/download/v2.11.2/docker-compose-linux-aarch64

将文件改名为docker-compose

1
mv docker-compose-linux-aarch64 docker-compose

将文件移动到/usr/local/bin/

1
mv docker-compose /usr/local/bin/

添加可执行权限

1
sudo chmod +x /usr/local/bin/docker-compose

查看docker-compose版本

1
docker-compose -v

首次使用

我们每次使用docker运行容器所需的镜像来源都是官方的镜像仓库,由于docker的镜像仓库在国外,可能在访问时存在网络问题,可能有时候会拉取失败,所以我们将docker镜像源设置为国内的镜像源,这样下载的成功了也会高一点。

添加镜像源

一键添加镜像源

或者你也可以按照以下步骤,在/etc/docker/daemon.json文件添加镜像源,如果没有该文件则新建一个。

进入root管理员

1
su root

一键添加源

1
mkdir -p /etc/docker/ && cd /etc/docker/ && touch daemon.json && echo {\"registry-mirrors\":[\"https://docker.mirrors.ustc.edu.cn\"]} >> daemon.json

打开文件

1
vim /etc/docker/daemon.json

写入镜像源(此处用中科大源)

将以下内容写入到/etc/docker/daemon.json文件中

1
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}

加载配置 && 重启docker

1
2
sudo systemctl daemon-reload  # 重新加载配置
sudo systemctl restart docker # 重启docker服务

部署Docker的容器

介绍

已经安装完Docker、docker-compose了,就可以开始部署Docker服务了。这里的服务一般表示为一个软件执行生成的服务,比如运行一个mysql、frp服务,我们要运行这些服务,我们在Windows上想要运行这个服务,是不是先要下载安装包,然后安装软件,安装完后打开软件,配置软件运行参数,然后启动运行。

我们使用docker部署一个服务,也是需要下载安装包,然后设置运行参数,然后启动就好了,比在Windows上省略了一点步骤。这里的下载安装包就是在docker下载镜像,设置运行参数就是编写docker-compose.yml文件,启动容器就是docker-compose up -d,如果你使用docker run XXX这种方式启动容器更快,是不是感觉使用docker运行一个服务比传统安装方式方便许多呢。

下面我们具体举例运行一个docker容器,比如,我这里安装一个Docker web控制面板portainer为例,这个portainer服务功能就是将Docker的运行情况显示在web页面上,通过web页面鼠标点点代替命令行管理Docker容器。

每一个服务都是一个独立的容器。

使用命令行部署服务

下载portainer镜像

在运行portainer程序前,我们需要下载portainer镜像,就类似我们在使用某个APP时,要下载安装包,然后安装软件才能使用。

1
docker pull portainer/portainer

01-下载镜像-20221106-153

运行容器

运行容器,类似用安装包安装软件一样,安装完后自动启动这个portainer容器,一个容器可以当做是一个或多个服务来理解,因为有些容器里面有运行多个服务的。

1
docker run -d --name portainerUI -p 9000:9000 -v /home/docker/portainer:/var/run/docker.sock portainer/portainer

解释:

  • -d:让该服务在后台运行
  • --name:给该容器起一个名字
  • -p:定义端口映射。主机端口:容器端口
  • -v:数据卷挂载。主机路径:容器路径
  • portainer/portainer:你要运行的镜像名。

上面这些参数一般看镜像介绍文档,看具体需要加什么参数,不加的话,对应的功能就没有办法使用,可能还会导致运行失败。

其中比较重要的参数-p,想从外网访问该容器的服务器,就没有办法访问了,因为这个端口就类似一条通道,放开该通道给外网访问,不作端口映射,表示不添加这条通道,外网就找不到这条通道了。

-v:数据挂载。就是将你宿主机的某个文件夹挂载到docker容器里面,这样你的docker容器里面就可以访问到你挂载的文件夹了。

在作端口映射时,记得给主机开放端口。

02-运行容器-20221106-479

查看portainer安装效果

1
http://IP:9000

上面我们使用命令行运行了一个Docker容器,如果你要运行其他容器,也是类似这样子,先下载镜像,然后运行容器就可以了,只有简单的两步。

当然,你也是可以选择docker-compose这种方式部署容器,这种方式部署容器有个好处就是,方便管理,因为你这个容器的全部配置信息都可以通过这个docker-compose.yml文件可以看到,你下一次要配置和这个一模一样的容器环境,你只需要复制这个docker-compose.yml文件信息就可以了。

使用docker-compose创建容器

我们在安装docker时,一般都是推荐一起安装docker-compose的。

Docker Compose是一个用于定义和管理多个Docker容器的工具。Docker Compose通过定义docker-compose.yml容器配置来生成容器,同时也可以使用docker-compose命令管理docker-compose.yml所定义的全部容器,比如使用docker-compose down关闭docker-compose.yml所定义全部容器。

使用docker-compose的好处是可以做到配置持久化,这样过一段时间再来查看该容器,可以通过查看docker-compose.yml就知道该容器的配置情况,同时,容器的可定制程度更加方便。

新建一个docker-compose.yml文件

一般建议在/home/docker/下新建一个文件夹来存储每个Docker服务的数据。

01-新建文件-20221106-405

编写docker-compose.yml

1
2
3
4
5
6
7
8
9
10
version: '3.1'
services:
portainer: # 服务名称
image: portainer/portainer # 镜像版本 默认最新
restart: always # 启动方式
container_name: portainer #容器名称
volumes: # 本机路径:容器路径,这里我使用相对路径
- ./docker.sock:/var/run/docker.sock
ports: # 端口映射,本机端口:容器端口
- 9000:9000

02-编写docker-compose-20221106-648

这里有个要注意的点:

  1. 如果你是首次启动这个docker-compose.yml服务,version的版本不能大于x.1,比如,你写3.2,可能会导致启动失败
  2. 每一个容器的名字都是唯一的,容器之间的名字不能相同

要是启动容器前没有下载镜像,也是没有关系的,因为我们在docker-compose.yml指定了镜像名,在启动容器docker-compose up -d时,docker会自动下载镜像。

启动服务

1
docker-compose up -d
  • up:启动程序服务
  • -d:在后台运行

关闭服务

如果需要关闭该服务,则进入docker-compose.yml父目录下,执行docker-compose down

03-关闭服务-20221106-264

你可能会有个疑虑了,我们启动这么多容器,每一个容器里面都有一个Linux系统,会不会很占存储呢?其实占用的存储还是有的,但不是很大,相比传统的虚拟机,虚拟出一整个完整的系统,docker容器就显得很小了。

因为在docker容器中,我们首先是拉取了一个镜像,我们创建的容器都是基于这个镜像进行生成的,我们每创建一个容器,每需要添加或修改的内容都在是这个镜像上面进行叠加层,就好像叠瓦片一样,每在docker容器里面修改容器,就在原来的基础上叠一个瓦片,这样就可以做到既不对原有的镜像进行修改,又可以做到我们想要的内容。

更新docker-compose

如果在启动完服务之后有需要修改某些服务的配置时,可以直接对docker-compose.yml修改,修改完之后,关闭服务(关闭服务,表示销毁该容器,如果容器内数据需要备份,则应先复制出来宿主机),再重新启动服务即可。

1
2
docker-compose down
docker-compose up -d
  • down:表示关闭该服务
  • up:启动docker-compose
  • -d:表示该docker-compose运行的容器在后台启动

如果有重要的数据在容器中,一般都是强烈建议将数据挂载到宿主机,这样可以保证数据的安全性,因为谁知道哪天docker容器出什么问题,数据就没了,一旦挂载到宿主机,数据就存在宿主机,安全性提高很多,如果这个数据还是很重要,那还是做个备份吧,备份到其他云上,比如duplicaty备份工具。

创建容器但不启动

nginx:latest镜像创建一个容器名为nginx-test

1
docker create --name nginx-test  nginx:latest      
  • create:效果等于run,表示创建一个新容器
  • --name:自定义容器名

创建容器并运行命令

OPTIONS参数含义说明:

  • -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
  • -d: 后台运行容器,并返回容器ID;
  • -i: 以交互模式运行容器,通常与 -t 同时使用;
  • -P: 随机端口映射,容器内部端口随机映射到主机的端口
  • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  • --name="nginx-lb": 为容器指定一个名称;
  • --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  • --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  • -h "mars": 指定容器的hostname;
  • -e username="ritchie": 设置环境变量;
  • --env-file=[]: 从指定文件读入环境变量;
  • --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  • **-m 😗*设置容器使用内存最大值;
  • --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  • --link=[]: 添加链接到另一个容器;
  • --expose=[]: 开放一个端口或一组端口;
  • --volume , -v: 绑定一个卷
1
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

案例

1-使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

1
docker run --name mynginx -d nginx:latest

2-使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

1
docker run -P -d nginx:latest

3-使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

1
docker run -p 80:80 -v /data:/data -d nginx:latest

4-绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

1
$ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash

5-使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

1
2
runoob@runoob:~$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#

Docker常用的指令

查看容器、镜像

由于Docker的容器ID、镜像ID比较长,我们在使用到容器ID、镜像ID时,可以输入ID的前面几位,一般大于2位以上来替代完整的ID。

查看Docker全部镜像

1
docker images

查看Docker已启动的服务

1
docker ps

查看Docker全部容器

1
docker ps -a

启动、停止、重启容器

启动容器是指已经创建好的容器,但已经停止该容器,还没删除的容器,此时可以重启该容器,类似手机开关机。

停止、重启容器有两个方式,一个是通过指定容器ID,一个方式是指定容器名,即CREATED

查看容器ID

1
docker ps -a

启动容器

启动容器可一次性启动一个容器或多个容器。

指定容器ID启动

1
docker start 容器ID [容器ID]

指定容器名启动

1
docker start 容器名 [容器名]

停止容器

指定容器ID

1
docker stop 容器ID

指定容器名

1
docker stop 容器名

停止正在运行的全部容器

如果有需要停止全部容器的话,使用**docker stop `docker ps -a -q`**最好用

1
docker stop `docker ps -a -q`

重启容器

指定容器ID

1
docker restart 容器ID

指定容器名

1
dockre restart 容器名

删除容器

删除容器三步法:

  1. 查看容器ID:docker ps -a
  2. 停止容器:docker stop 容器ID
  3. 删除容器:docker rm 容器ID

查看容器ID

1
docker ps -a

停止容器

1
docker stop 容器ID

删除容器

1
docker rm -f 容器ID [容器ID]
  • -f:表示停止该容器并删除
  • 容器ID:可以输入前几位即可或者完整ID

可以一起删除多个容器,在容器ID后累加即可。

删除镜像

因为容器是基于镜像运行起来的,如果要删除镜像,表面你也不需要这个服务了,那该镜像产生的容器也应该要删除掉,这样可以减少多余的垃圾对服务器的影响。

总的来说,应先删除容器,再删除镜像。

通过ID删除镜像

1
2
3
docker rmi IMAGEID # 使用镜像ID删除镜像
docker rmi 0e901e68141f # 删除镜像
docker rmi 0e9 #或者使用简短的ID前三位

通过TAG删除镜像

1
2
3
docker rmi REPOSITORY:TAG # 删除镜像样例
docker rmi nginx:latest # 删除镜像
docker images # 查看镜像

rm参数含义

  • **-f 😗*通过 SIGKILL 信号强制删除一个运行中的容器。
  • **-l 😗*移除容器间的网络连接,而非容器本身。
  • **-v 😗*删除与容器关联的卷。

删除所有已经停止的容器

谨慎操作,这是删除全部已停止的容器

1
docker rm $(docker ps -a -q)

进入Docker容器

我们有时候需要进去Docker容器查看什么文件,或者修改某个配置文件等等操作,我们比较常用的还是使用docker exec ....

方法一:exec(推荐)

1
2
docker ps
docker exec -it ID /bin/bash

**区别:**进入正在运行的容器,不会新建别的容器

  • -i:表示运行对容器进行交互式操作
  • -t:在容器中创建一个伪终端

方法二:attach

1
docker run -it IMAGE(镜像名) /bin/bash 

**区别:**进入一个新建的容器,而不是原本已经存在的容器

  • run:创建一个新的容器
  • -i:表示运行对容器进行交互式操作
  • -t:在容器中创建一个伪终端

更改镜像名

查看镜像

1
docker images

更改镜像名

1
2
docker tag <Image ID> 新镜像名
docker tag 4ec22c7a983e transmission-hikki

01-更改镜像名-20231110-745

容器之间通信

需求总是多变的,比如我们要部署了Nginx、MySQL、Jenkins容器,我们怎么让容器之间互相通信呢?

我们可以使用--link指令在容器之间建立一条网络通信隧道,就好比你和隔壁家拉一条水管,可以使用水管来传输东西。

创建httpd容器web1

1
docker run -d -P --name web1 httpd

创建httpd容器web2

1
docker run -d -P --name web2 --link web1:web1 httpd
  • run:运行容器
  • -d:表示该容器在后台运行
  • -P:将容器内部使用的网络端口随机映射到我们使用的主机上
  • --name:给该容器命名
  • --link:建立通信隧道

进入容器ping测试

进入web2容器:

1
docker exec -it web2 /bin/bash

我这里使用的是Ubuntu系统,下面会使用ping工具,需要先安装ping

1
apt-get -y install iputils-ping

ping 测试

1
ping web1

查看Docker容器日志

1
docker logs [OPTIONS] CONTAINER(容器名)

OPTIONS(可选参数):

  • --details:显示更多的信息

  • -f:跟踪实时日志

  • --since:显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)

  • --tail :从日志末尾显示多少行日志, 默认是all

  • -t:显示时间戳

  • --until:显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)

实战案例

查看指定时间后的日志,只显示最后100行

1
docker logs -f -t --since="2022-11-06" --tail=50 容器ID

查看最近30分钟的日志

1
docker logs --since 30m 容器ID

查看某时间之后的日志

1
docker logs -t --since="2022-11-06T13:23:37" 容器ID

查看某时间段日志

1
docker logs -t --since="2022-11-05T13:23:37" --until "2022-11-06T12:23:37" 容器ID

将容器资源复制到本机

从容器复制文件 到本地

1
2
3
4
5
6
7
# 将容器nginx01 的html资源复制到本机的/home/lilbai/docker_app/nginx(当前文件夹下无html文件夹)
# 格式 docker cp 容器名:容器路径 本机路径
# 格式 docker cp 容器ID:容器路径 本机路径
# 方法一:使用绝对路径
sudo docker cp nginx01:/usr/share/nginx/html /home/lilbai/docker_app/nginx # 使用容器名
# 方法二:使用相对路径 我现在在/home/lilbai/docker_app/nginx路径下
sudo docker cp 3dec77ff864f:/usr/share/nginx/html ./html # 使用容器ID

将本地文件复制到容器

靠近容器ID或者容器名是容器路径

1
2
3
4
5
# 格式   docker cp 本机路径容器名:容器路径
# 格式 docker cp 本机路径容器ID:容器路径
#方法一:
docker cp /home/lilbai/docker_app/nginx nginx01:/usr/share/nginx/html # 容器名
docker cp /home/lilbai/docker_app/nginx 3dec77ff864f:/usr/share/nginx/html # 容器ID

Docker容器内常见的问题

Docker内不能用vim

Docker容器内本来是非常精简的,会减少尽量不必要的程序,vi和vim编辑器都是没有的,所以需要自己在容器内安装一个vim编辑器。

用特殊方法进入容器

1
2
# docker -it -u 0 容器ID或者容器名 /bin/bash
docker run -it -u 0 imaegoo/twikoo /bin/bash

更新包

1
apt-get update

安装vim

1
apt-get install vim

docker内不能使用ll命令

ll指令是由ls -l组成的,想方便使用ll指令,则编辑bash指令文件,添加快捷指令即可,因为需要编辑文件,需要先安装vim。

不能使用ll

1
2
root@3052a7d5f95b:/app/data# ll
bash: ll: command not found

编辑.bashrc

1
vim ~/.bashrc

添加alias

1
alias ll='ls -l'

加载.bashrc文件

1
source ~/.bashrc

docker compose 相关指令

docker compose配置文件字段

字段 描述
build dockerfile context 指定Dockerfile文件名构建镜像上下文路径
image 指定镜像
command 执行命令,覆盖默认命令
container name 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
deploy 指定部署和运行服务相关配置,只能在Swarm模式使用
environment 添加环境变量
networks 加入网络
ports 暴露容器端口,与-p相同,但端口不能低于60
volumes 挂载宿主机路径或命令卷
restart 重启策略,默认no,always,no-failure,unless-stoped
hostname 容器主机名

docker compose命令

使用格式:docker-compose [options] [COMMAND] [ARGS...]

命令 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

Docker私有仓库

Harbor介绍

  • Vmware公司开源的企业级Docker Registry项目

Harbor优势:

  • 管理UI
  • 基于角色的访问控制
  • 基于镜像的复制策略
  • AD/LDAP集成
  • 审计
  • RESTful API

Docker私有仓库架构拓扑

image-20230311164338120

Harbor的主要组件

Proxy:通过一个前置的反向代理统一将请求转发给后端不同的服务

**Registry:**负责储存Docker镜像,并处理docker push/pull 命令

**Core services:**Harbor的核心功能,包括UI、webhook0、token 服务

**Datebase:**为core services提供数据库服务

**Log collector:**负责收集其他组件的log,供日后进行分析

安装Harbor

安装Harbor需要docker-compose,还没安装可以看文字上面安装docker-compose

下载Harbor

1
wget -c https://github.com/goharbor/harbor/releases/download/v2.5.6/harbor-offline-installer-v2.5.6.tgz

升级Docker版本

原因

如果你一开始安装的docker-ce版本比较低,在后面拉取镜像可能会出现以下这种问题,找不到某些镜像,这时候升级版本可能可以解决你的问题。

00-无法找到镜像-20230420-129

卸载docker

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

安装Docker

然后按照文章上面的安装步骤重新安装即可。或如按照下面命令安装

1
2
3
4
5
6
7
8
9
10
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

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

sudo yum install docker-ce

sudo systemctl start docker

sudo systemctl enable docker

其他问题

如果没有卸载旧版的docker会出现如下问题:

01-安装新版冲突-20230420-227