docker 的使用
一、docker 的概念
1.虚拟化和容器技术
1.1• 虚拟化技术
Type1: 不安装宿主机操作系统,而直接在硬件基础上安装虚拟化管理软件
Type2: 安装宿主机操作系统,在宿主机操作系统之上安装虚拟化管理软件
1.2• 容器技术
Container 是在宿主机操作系统上使用Cgroups,Namespaceses技术创建出来具有边界的特殊进程
1.3• 区别
虚拟化技术会虚拟出多个内核,每个虚拟机拥有一个自己的内核,彼此之间隔离性非常好。并且在创建虚拟机之初就定义好了虚拟机的资源限制,如CPU核心数,内存大小,磁盘大小等。
容器技术是直接运行在宿主机之上的,多个容器共用一个内核,因此隔离效果比较差,但是性能更好。
2.容器化的基础
2.1 Chroot
如果需要在一个宿主机上运行多个容器,且容器之间相互个离,那么第一个就需要系统库文件的依赖,对于一个容器而言,需要将其需要的系统文件单独复制出来一份,放到指定目录,并且需要让进程认为这就是根目录,而不是去调用宿主机系统上的库文件。Chroot就是一个切换根目录的方式。
2.2 NameSpaces
为了让多个容器以沙盒的方式在宿主机上运行,就需要提前定义好各个容器能看到的边界。由于各个容器都是直接运行在宿主机系统上,因此需要内核对各个容器的上下文进行修改,让他们看上去是一个独立的操作系统。比如,指定PID为1的进程,指定网卡设备,指定文件系统挂载,指定用户等等。
Linux操作系统内核从底层实现了为各个进程创建独立用户空间的功能,不同用户空间似于一个个独立的虚拟机系统,用户空间内部进程不能感知到其它用户空间中的进程状态。内核提供了六种Namespaces:

2.3 Cgroups
Namespaceses通过障眼法实现了用户空间的隔离,但是没办法对硬件资源进行限制,当一个容器进行CPU密集型操作时,会消耗掉整个宿主机的CPU资源,进而影响了其它容器的正常运行。
因此在Namespaceses之上,还需要对各个容器实现硬件资源限制,比如CPU,Memory,diskio等等。
3. Docker的架构
Docker的组件

Docker服务有三个部分组成,分别是Client,Docker Host,Registry。当创建新的容器时,会向Docker Daemon发送指令,Docker Daemon通过本地镜像文件创建容器,当本地不存在镜像时,将从Registry下载镜像。
Client: 客户端
Docker Host:主机
Registry:镜像仓库
Registry由两个部分组成:
• Repostitory
• 由特定的docker镜像的所有迭代版本组成一个镜像仓库
• 一个Registry可以包括多个Repostitory
• Repostitory包含顶层仓库和用户仓库
• 顶层仓库: 仓库名:标签, nginx:latest
• 用户仓库: 用户名/仓库名:标签, heyang/nginx:1.4.2
• 一个镜像可以有多个标签,如最新版的nginx,可以是nginx:latest,nginx:1.4.2
• Index
• 提供用户认证、镜像检索功能
二、Docker安装
1.Docker安装配置
docker 是一个典型的C/S架构
Docker在2017年以前时使用大版本号+小版本号来名,在2017年之后,采用YY.MM.N-xx格式,如 19.03.1-ce表示2019年3月份的第2个ce版本。以CentOS 7安装docker-ce版本为例
[root@docker-24-20 ~]# uname -r # 确认内核版本,要求大于3.8
3.10.0-862.el7.x86_64
[root@docker-24-20 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@docker-24-20 ~]# yum install -y docker-ce # 安装docker-ce
[root@docker-24-20 ~]# vim /etc/docker/daemon.json # 初始化配置
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io"],
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"bip": "172.24.20.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-opts": {"max-size":"32M", "max-file":"2"},
"live-restore": true
}
[root@docker-24-20 ~]# mkdir -p /data/docker
[root@docker-24-20 ~]# systemctl start docker && systemctl enable docker
[root@docker-24-20 ~]# ip addr show dev docker0 # 确认IP地址
[root@docker-24-20 ~]# docker version # 查看版本
[root@docker-24-20 ~]# docker container run --rm hello-world # 测试docker是否运行正常
Unable to find image 'hello-world:latest' locally
daemon.json 配置介绍
[root@docker-24-20 ~]# vim /etc/docker/daemon.json
{
"graph": "/data/docker",
"storage-driver": "overlay2",
"insecure-registries": ["registry.access.redhat.com","quay.io"],
"registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
"bip": "172.24.38.1/24",
"exec-opts": ["native.cgroupdriver=systemd"],
"live-restore": true
}
# 配置项注意点:
# graph: 该关键字未来将被弃用,可以采用 "data-root" 替代
# storage-driver: 存储驱动,即分层文件系统
# insecure-registries: 不安全的docker registries,即使用http协议推拉镜象
# registry-mirrors: 加速站点,一般可以使用阿里、网易云、docker中国(https://registry.docker-cn.com)的地址
# bip: 指定docker bridge地址(不能以.0结尾),生产中建议采用 172.xx.yy.1/24,其中xx.yy为宿主机ip后四位,方便定位问题
# 若启动失败,查看 /var/log/message 日志排错
Docker 信息查看
[root@docker-24-20 ~]# docker info # Docker 信息查看
Client:
Debug Mode: false
Server:
Containers: 0 # 容器数量
Running: 0
Paused: 0
Stopped: 0
Images: 1 # 镜像数量
Server Version: 19.03.5 # server 版本
Storage Driver: overlay2
Backing Filesystem: xfs # 宿主机上的底层文件系统
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: systemd # Cgroups 驱动
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: b34a5c8af56e510852c35414db4c1f4fa6172339
runc version: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-862.el7.x86_64 # 宿主机的相关信息
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.685GiB
Name: docker-24-20
ID: ASZO:NO2O:EJ2W:WGN5:MWAL:MBMP:TURI:WKNC:YUPS:E4E2:MATG:MXV3
Docker Root Dir: /data/docker # docker 数据存储目录
Debug Mode: false
Registry: https://index.docker.io/v1/ # registry 地址
Labels:
Experimental: false
Insecure Registries:
quay.io
registry.access.redhat.com
127.0.0.0/8
Registry Mirrors: # 加速站点
https://q2gr04ke.mirror.aliyuncs.com/
Live Restore Enabled: true
WARNING: bridge-nf-call-iptables is disabled # 当前两个warn需要设置内核模块
WARNING: bridge-nf-call-ip6tables is disabled
2. Docker pull配置代理
部分场景中,下载国外镜像非常慢,因此可以配置相关代理进行加速,方法如下:
配置宿主机代理
1. 找到 Lantern 的代理服务器的http(s)监听地址,以当前宿主机 127.0.0.1:9768 为例
2. 配置windows端口的转发,将所有10.4.7.1的10080端口转发至 127.0.0.1:9768
netsh interface portproxy add v4tov4 listenaddress=10.4.7.1 listenport=10080 connectaddress=127.0.0.1 connectport=9768
3. 配置windows防火墙策略,允许 10.4.7.0/24 网段访问 10.4.7.1:10080
4. 配置Linux机器的http和https代理
[root@centos-7-50 ~]# export http_proxy="10.4.7.1:10080"
[root@centos-7-50 ~]# export https_proxy="10.4.7.1:10080"
5. 测试
[root@centos-7-50 ~]# curl -I https://www.google.com
HTTP/1.1 200 OK
Date: Friday, 20-Mar-20 09:55:18 CST
Keep-Alive: timeout=58
Content-Length: 0
# 实验环境的虚拟机使用的是 10.4.7.0/24 的NAT网络,宿主机地址为 10.4.7.1
配置docker代理
root@ubuntu-7-61:~# mkdir /etc/systemd/system/docker.service.d
root@ubuntu-7-61:~# vim /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://10.4.7.1:10080"
root@ubuntu-7-61:~# systemctl daemon-reload
root@ubuntu-7-61:~# systemctl restart docker
root@ubuntu-7-61:~# docker info 2>&1 | grep -i proxy
HTTP Proxy: http://10.4.7.1:10080
三、 镜像
1. 什么是docker镜像?
概念:镜像是容器的打包。
docker镜像是一个典型的分层结构。
只有最上面一层是可写的 其他都是只读的固化到镜像的
每次推送都是增量的。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。

2.镜像名称的结构
${registry_ name}/${repository. name}/${image. name}:${tag. name}
翻译:远程镜像点/远程点的仓库名/镜像名:标签
例如:
docker.io/library/alpine:3.10.1
3. docker镜像常用命令:
# 查看当前所有镜像
docker images
#查询镜像
docker search
#登录远程镜像仓库
docker login
#查看已经登录的信息
cat /root/.docker/config.json
#下载拉取镜像
docker pull image_name 或者 image_name:tag
#全路径下载拉取镜像
docker pull docker.io/library/alpine:3.10.3
#给镜像打标签
docker tag image_id ${registry_ name}/${repository. name}/${image. name}:${tag. name}
举例:docker tag 965ea09ff2eb docker.io/mmdghh/alpine:v3.10.3
${registry_ name} ==> 指定镜像仓库网址
${repository. name} ==> 指定你的镜像仓库(docker-hub下的是你注册账号)
${image. name}:${tag. name} ==> 指定你的镜像名称及tag名称
#上传镜像
docker push ${registry_ name}/${repository. name}/${image. name}:${tag. name}
举例:docker push docker.io/mmdghh/alpine:v3.10.3
#删除指定镜像
docker rmi image_id
#强制删除镜像
docker rmi -f image_id
三、容器
1.容器的概念
容器是镜像的实例
容器的本质就是一个视图隔离、资源可限制、独立文件系统的进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。
2.容器启动过程四个步骤
1. Docker客户端联系Docker服务端。
2. Docker服务端从Docker中心拉取“hello-world”映像。
3. Docker服务端(用新拉的镜像)创建了一个新的容器,该容器运行可执行文件(脚本),生成您当前读取的输出。
4. Docker服务端将信息流推到Docker客户端,由客户端展示在你的终端。
3.启动容器(运行镜像)
命令格式: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS :选项
-i:表示启动-一个可交互的容器, 并持续打开标准输入
-t:表示使用终端关联到容器的标准输入输出上
-d :表示将容器放置后台运行
--rm:退出后即删除容器
--name :表示定义容器唯一名称
IMAGE :表示要运行的镜像
COMMAND :表示启动容器时要运行的命令*
ARG:参数
4.容器的常用命令
# 查看容器信息
docker info
# 查看所有容器
docker ps -a
# 查看所有容器的id
docker ps -aq
# 交互式启动容器(/bin/bash 指定进程夯住,容器不会挂掉)
docker run -it +image_name /bin/bash #在前台启动容器
docker run -d +image_name /bin/bash #在后台启动容器
# 停止容器
docker stop container_id
# 重启容器
docker restart container_id
# 删除容器
docker rm container_id
docker rm -f container_id
# 删除所有未在运行的容器
docker rm `docker ps -a -q`
# 进入容器内部
docker exec -it container_id /bin/sh
# 容器打包成镜像
docker commit -p 镜像名称:标签名
# 镜像导出
docker save -o xxx.tar image_name/image_id
docker save image_name/image_id > xxx.tar
# 镜像导入
docker load -i xxx.tar
docker load < xxx.tar
# 查看容器日志
docker logs container_id
# 保存到执行命令这一时刻的内容 之后更新的不会报错
docker commit -p
# 在宿主机和容器之间传输文件(容器传输到本地)
docker cp container_id:/tmp/xxx.txt .
# 查看容器详情
docker inspect container_id
5.容器进阶参数
-p 端口映射
-p host_port:container_port
# 将本机的83端口映射到容器的80端口
[root@alice ~]# docker run -d --name nginx -p 83:80 nginx:1.12.2
-v 挂载目录
-v 宿主机目录:容器内目录
# 将本机的/root/html 目录挂载到容器的/usr/share/nginx/html目录
[root@alice ~]# docker run -d -p 80:80 -v /root/html:/usr/share/nginx/html nginx
-e 传递环境变量
-e 宿主机变量 容器名称
# 将变量E_OPTS传递到容器内,打印所有的变量
[root@alice ~]# docker run --rm -e E_OPTS=abcdefg alpine:latest printenv
四、镜像与容器的关系

容器是镜像的实例化,镜像是容器的打包
五、dockerrrfile
1.什么是dockerfile?
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
2.dockerfile的编写
注意:dockerfile 必须基于基础镜像编写
FROM debian:stretch
由于dockerfile中每一个指令都会建立一层,每一个 RUN 的行为,会新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。镜像是多层存储,每一层的东西并不会在下一层被删除,会一直跟随着镜像。因此镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。(安装包、缓存等)
Dockerfile 支持 Shell 类的行尾添加 \ 的命令换行方式,以及行首 # 进行注释的格式。良好的格式,比如换行、缩进、注释等,会让维护、排障更为容易,这是一个比较好的习惯。
FROM debian:stretch
RUN buildDeps='gcc libc6-dev make wget' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
3.构建镜像
命令格式为docker build [选项] <上下文路径/URL/->
在 Dockerfile 文件所在目录执行:
[root@supercomputer]# docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
在这里我们指定了最终镜像的名称 -t nginx:v3
FROM scratch
Docker 还存在一个特殊的镜像,名为 scratch。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
4.常用的dockerfile模块
RUN #执行命令
COPY #复制文件
ADD #更高级的复制文件,可以解压文件
CMD #容器启动命令,用于dockerfile 最后启动容器的命令
ENV #设置环境变量
EXPOSE #暴露端口
WORKDIR #指定工作目录
USER #指定当前用户
六、Docker的四种网络模型
NAT(默认)
直接虚拟出容器的网卡
None
无网络,单机模式
使用方法
--net=none
多用于不对外提供网络接口的服务
host
和宿主机共享一个网络空间
使用方法
--net=host
联合网络
和另一个容器共享网络空间
使用方法
--net=container:container_id
七、镜像仓库
docker-harbor
部署思路
第一步:安装docker和docker-compose
第二步:下载harbor-offline-installer-v1.9.0-rc1.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.yml配置文件 hostname = 10.0.0.11 harbor_admin_password = 123456
第五步:执行install.sh3
1.安装docker-compose
1.安装docker-compose
yum install -y python3-pip
2.这里使用pip安装,默认源为国外,可以使用国内加速,相关网站
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
pip加速操作命令
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
3.继续安装docker-compose
pip3 install docker-compose
4.检查
docker-compose version
2.下载、上传解压docker-harbor
[root@docker01 ~]# wget https://storage.googleapis.com/harbor-releases/release-1.9.0/harbor-offline-installer-v1.9.0-rc1.tgz
[root@docker01 ~]# cd /opt/
[root@docker01 /opt]# ls
harbor-offline-installer-v1.9.0-rc1.tgz
[root@docker01 /opt]# tar zxf harbor-offline-installer-v1.9.0-rc1.tgz
[root@docker01 /opt]# ls
harbor harbor-offline-installer-v1.9.0-rc1.tgz
[root@docker01 /opt]# cd harbor/
3.修改配置文件
[root@docker01 /opt/harbor]# egrep "10.0.1.11|123456" harbor.yml
hostname: 10.0.1.11
harbor_admin_password: 123456
4.安装
[root@docker01 /opt/harbor]# ./install.sh
5.修改docker信任仓库
[root@docker01 /opt/harbor]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["http://10.0.1.11"]
}
6.重启docker并上传镜像
systemctl restart docker
7.给镜像打标签并提交到dockerharbor
[root@docker01 /opt/harbor]# docker login 10.0.1.11
Username: zhangya
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@docker01 ~]# docker run -d -p 8080:80 centos_kod:v1
78be80f7c2029b68e8943e38fa99131ec6709f798e63c94afb5a7fdfa4a8047c
[root@docker01 ~]# docker ps|grep kod
78be80f7c202 centos_kod:v1 "/bin/bash /init.sh" 15 seconds ago Up 13 seconds 0.0.0.0:8080->80/tcp tender_dirac
[root@docker01 ~]# docker commit 78be80f7c202 10.0.1.11/linux/centos_kod:v1
sha256:6bf1e1eef1969bcd4c82472aed945d4dda74a923c0d7dae91e38539676f8c240
[root@docker01 ~/dockerfile/kod]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
10.0.1.11/linux/centos_kod v1 6bf1e1eef196 13 minutes ago 465MB
[root@docker01 /opt/harbor]# docker push 10.0.1.11/linux/centos_kod:v1
8.其他主机上下载镜像
[root@docker02 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["http://10.0.1.11"],
"insecure-registries": ["https://10.0.1.11"]
}
[root@docker02 ~]# docker pull 10.0.1.11/linux/centos_kod:v1

浙公网安备 33010602011771号