介绍
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 新的层上。我们安装应用程序的层就是容器。每个在主机上运行的容器都是独立的,因此,提供了一个安全的应用平台。
虚拟机和容器的区别
虚拟化
容器化技术
虚拟化技术和容器技术性能对比
特性 |
虚拟机 |
容器 |
硬盘空间 |
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
|

更新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
|


设置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(阿里仓库)
|

查看docker版本有那些
1
| yum list docker-ce --showduplicates | sort -r
|

选择一个版本安装
1
| yum -y install docker-ce-18.03.1.ce
|

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

设置开机启动docker
刚安装完的docker是还没启动的,需要启动才能执行docker命令
设置开机不启动docker
Ubuntu18.04安装Docker-CE社区版
本次安装环境在华为服务器Ubuntu安装Docker
因为Ubuntu官方系统里自带的Docker版本不是最新的,为了安装最新版本,我们要从官方Docker库里下载,为此,需要先添加几个包源,添加GPG公钥来确保下载和安装的有效性。
更新现有包列表

安装几个依赖包,让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"
|

再次更新现有包列表

查看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的运行状态吧
你看到的输出应该是这样的

设置开启自启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
|
将文件软链接到 /usr/bin/目录下
1
| sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
|
查看版本
1
| docker-compose --version
|
方式二:pip方式安装
安装pip
1 2
| yum -y install epel-release yum -y install python-pip
|
查看pip版本
更新pip
1
| pip install --upgrade pip
|
安装docker-compose
1
| pip install docker-compose
|
查看docker-compose版本
方式三:手动安装
下载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版本
首次使用
首次使用需要添加一下镜像源
添加镜像源
一键添加镜像源
或者你也可以按照以下步骤,在/etc/docker/daemon.json
文件添加镜像源,如果没有该文件则新建一个。
进入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-compose了,就可以开始安装Docker服务了,比如,我这里安装一个Docker web控制面板portainer为例。
下载portainer镜像
在运行portainer程序前,我们需要下载portainer镜像,就类似我们在使用某个APP时,要下载安装包,然后安装软件才能使用。
1
| docker pull portainer/portainer
|

运行容器
运行容器,类似用安装包安装软件一样,安装完后自动启动这个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
,想从外网访问该容器的服务器,就没有办法访问了,因为这个端口就类似一条通道,放开该通道给外网访问,不作端口映射,表示不添加这条通道,外网就找不到这条通道了。
在作端口映射时,记得给主机开放端口。

查看portainer安装效果
Docker常用的指令
查看容器、镜像
由于Docker的容器ID、镜像ID比较长,我们在使用到容器ID、镜像ID时,可以输入ID的前面几位,一般大于2位以上来替代完整的ID。
查看Docker全部镜像
查看Docker已启动的服务
查看Docker全部容器
启动、停止、重启容器
启动容器是指已经创建好的容器,但已经停止该容器,还没删除的容器,此时可以重启该容器,类似手机开关机。
停止、重启容器有两个方式,一个是通过指定容器ID
,一个方式是指定容器名
,即CREATED
。
查看容器ID
启动容器
启动容器可一次性启动一个容器或多个容器。
指定容器ID启动
1
| docker start 容器ID [容器ID]
|
指定容器名启动
停止容器
指定容器ID
指定容器名
停止正在运行的全部容器
如果有需要停止全部容器的话,使用**docker stop `docker ps -a -q`**最好用
1
| docker stop `docker ps -a -q`
|
重启容器
指定容器ID
指定容器名
删除容器
删除容器三步法:
- 查看容器ID:
docker ps -a
- 停止容器:
docker stop 容器ID
- 删除容器:
docker rm 容器ID
查看容器ID
停止容器
删除容器
1
| docker rm -f 容器ID [容器ID]
|
-f
:表示停止该容器并删除
容器ID
:可以输入前几位即可或者完整ID
可以一起删除多个容器,在容器ID后累加即可。
删除镜像
因为容器是基于镜像运行起来的,如果要删除镜像,表面你也不需要这个服务了,那该镜像产生的容器也应该要删除掉,这样可以减少多余的垃圾对服务器的影响。
总的来说,应先删除容器,再删除镜像。
通过ID删除镜像
1 2 3
| docker rmi IMAGEID docker rmi 0e901e68141f docker rmi 0e9
|
通过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)
|
容器之间通信
需求总是多变的,我们怎么让容器之间互相通信呢?
我们可以使用--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 测试
查看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
|
docker进入容器
方法一:exec(推荐)
1 2
| docker ps docker exec -it ID /bin/bash
|
**区别:**进入正在运行的容器,不会新建别的容器
-i
:表示运行对容器进行交互式操作
-t
:在容器中创建一个伪终端
方法二:attach
1
| docker run -it IMAGE(镜像名) /bin/bash
|
**区别:**进入一个新建的容器,而不是原本已经存在的容器。
run
:创建一个新的容器
-i
:表示运行对容器进行交互式操作
-t
:在容器中创建一个伪终端
使用docker-compose创建容器
新建一个docker-compose.yml文件
一般建议在/home/docker/
下新建一个文件夹来存储每个Docker服务的数据。

编写docker-compose.yml
1 2 3 4 5 6 7 8 9 10
| services: portainer: image: portainer/portainer restart: always container_name: portainer volumes: - ./docker.sock:/var/run/docker.sock ports: - 9000:9000
|

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

更新docker-compose
如果在启动完服务之后有需要修改某些服务的配置时,可以直接对docker-compose.yml
修改,修改完之后,关闭服务(关闭服务,表示销毁该容器,如果容器内数据需要备份,则应先复制出来宿主机),再重新启动服务即可。
1 2
| docker-compose down docker-compose up -d
|
down
:表示关闭该服务
up
:启动docker-compose
-d
:表示该docker-compose运行的容器在后台启动
创建容器但不启动
用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:/
|
将容器资源复制到本机
从容器复制文件 到本地
1 2 3 4 5 6 7
|
sudo docker cp nginx01:/usr/share/nginx/html /home/lilbai/docker_app/nginx
sudo docker cp 3dec77ff864f:/usr/share/nginx/html ./html
|
将本地文件复制到容器
靠近容器ID或者容器名是容器路径
1 2 3 4 5
|
docker cp /home/lilbai/docker_app/nginx nginx01:/usr/share/nginx/html docker cp /home/lilbai/docker_app/nginx 3dec77ff864f:/usr/share/nginx/html
|
Docker容器内常见的问题
Docker内不能用vim
Docker容器内本来是非常精简的,会减少尽量不必要的程序,vi和vim编辑器都是没有的,所以需要自己在容器内安装一个vim编辑器。
用特殊方法进入容器
1 2
| docker run -it -u 0 imaegoo/twikoo /bin/bash
|
更新包
安装vim
docker内不能使用ll命令
ll
指令是由ls -l
组成的,想方便使用ll
指令,则编辑bash
指令文件,添加快捷指令即可,因为需要编辑文件,需要先安装vim。
不能使用ll
1 2
| root@3052a7d5f95b:/app/data bash: ll: command not found
|
编辑.bashrc
添加alias
加载.bashrc文件
docker conpose 相关指令
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私有仓库架构拓扑

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
|