Type1: 不安装宿主机操作系统,而直接在硬件基础上安装虚拟化管理软件
Type2: 安装宿主机操作系统,在宿主机操作系统之上安装虚拟化管理软件
Container 是在宿主机操作系统上使用Cgroups,Namespaceses技术创建出来具有边界的特殊进程
虚拟化技术会虚拟出多个内核,每个虚拟机拥有一个自己的内核,彼此之间隔离性非常好。并且在创建虚拟机之初就定义好了虚拟机的资源限制,如CPU核心数,内存大小,磁盘大小等。
容器技术是直接运行在宿主机之上的,多个容器共用一个内核,因此隔离效果比较差,但是性能更好。
如果需要在一个宿主机上运行多个容器,且容器之间相互个离,那么第一个就需要系统库文件的依赖,对于一个容器而言,需要将其需要的系统文件单独复制出来一份,放到指定目录,并且需要让进程认为这就是根目录,而不是去调用宿主机系统上的库文件。Chroot就是一个切换根目录的方式。
为了让多个容器以沙盒的方式在宿主机上运行,就需要提前定义好各个容器能看到的边界。由于各个容器都是直接运行在宿主机系统上,因此需要内核对各个容器的上下文进行修改,让他们看上去是一个独立的操作系统。比如,指定PID为1的进程,指定网卡设备,指定文件系统挂载,指定用户等等。
Linux操作系统内核从底层实现了为各个进程创建独立用户空间的功能,不同用户空间似于一个个独立的虚拟机系统,用户空间内部进程不能感知到其它用户空间中的进程状态。内核提供了六种Namespaces:
Namespaceses通过障眼法实现了用户空间的隔离,但是没办法对硬件资源进行限制,当一个容器进行CPU密集型操作时,会消耗掉整个宿主机的CPU资源,进而影响了其它容器的正常运行。
因此在Namespaceses之上,还需要对各个容器实现硬件资源限制,比如CPU,Memory,diskio等等。
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 是一个典型的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镜像是一个典型的分层结构。
只有最上面一层是可写的 其他都是只读的固化到镜像的
每次推送都是增量的。
镜像不包含任何动态数据,其内容在构建之后也不会被改变。
${registry_ name}/${repository. name}/${image. name}:${tag. name}
翻译:远程镜像点/远程点的仓库名/镜像名:标签
例如:
docker.io/library/alpine:3.10.1
# 查看当前所有镜像
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
#上传镜像
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. Docker客户端联系Docker服务端。
2. Docker服务端从Docker中心拉取“hello-world”映像。
3. Docker服务端(用新拉的镜像)创建了一个新的容器,该容器运行可执行文件(脚本),生成您当前读取的输出。
4. Docker服务端将信息流推到Docker客户端,由客户端展示在你的终端。
命令格式: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS :选项
-i:表示启动-一个可交互的容器, 并持续打开标准输入
-t:表示使用终端关联到容器的标准输入输出上
-d :表示将容器放置后台运行
--rm:退出后即删除容器
--name :表示定义容器唯一名称
IMAGE :表示要运行的镜像
COMMAND :表示启动容器时要运行的命令*
ARG:参数
# 查看容器信息
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 .
-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
容器是镜像的实例化,镜像是容器的打包
Dockerfile 是一个文本文件,其内包含了一条条的 指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
注意: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
命令格式为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。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。
RUN #执行命令
COPY #复制文件
ADD #更高级的复制文件,可以解压文件
CMD #容器启动命令,用于dockerfile 最后启动容器的命令
ENV #设置环境变量
EXPOSE #暴露端口
WORKDIR #指定工作目录
USER #指定当前用户
直接虚拟出容器的网卡
无网络,单机模式
使用方法
--net=none
多用于不对外提供网络接口的服务
和宿主机共享一个网络空间
使用方法
--net=host
和另一个容器共享网络空间
使用方法
--net=container:container_id
部署思路
第一步:安装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
yum install -y python2-pip
2.这里使用pip安装,默认源为国外,可以使用国内加速,相关网站
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
pip加速操作命令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
3.继续安装docker-compose
pip install docker-compose
4.检查
docker-compose version
[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/
[root@docker01 /opt/harbor]# egrep "10.0.1.11|123456" harbor.yml
hostname: 10.0.1.11
harbor_admin_password: 123456
[root@docker01 /opt/harbor]# ./install.sh
[root@docker01 /opt/harbor]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"insecure-registries": ["http://10.0.1.11"]
}
systemctl restart docker
[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
[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
原文:https://www.cnblogs.com/wzys/p/14584445.html