Docker容器、镜像、仓库

2021/03/29

Docker容器、镜像、仓库

参考资料

第1章 容器与容器编排技术全局认知

1.1 虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

  • 资源占用多
    虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
  • 冗余步骤多
    虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
  • 启动慢
    启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

1.2 Linux 容器 LXC

由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

  • 启动快
    容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
  • 资源占用少
    容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
  • 体积小
    容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

1.3 Docker容器是什么

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上, 也可以实现虚拟化,

容器是完全使用沙箱机制, 相互之间不会有任何接口, 更重要的是容器性能开销极低。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

Docker 的主要用途 :

  • Web应用的自动化打包和发布,自动化测试和持续集成、发布。
  • 创建轻量私有的PAAS环境
  • 提供弹性的云服务。因为Docker容器可以随开随关,很适合动态扩容和缩容。
  • 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

1.4 Cloud Foundry

1.5 容器技术该如何选型

1.6 资源管理和容器编排

资源管理和容器编排

  • 资源分配、兼容性判断
  • 部署、回滚
  • 服务发现、应用依赖
  • 健康检查、弹性伸缩
  • 业务、软件包、应用服务
  • 配置管理、快速复制

容器编排工具

  • Docker-compose
  • Kubernetes(K8S)
  • Mesos + Marathon
  • Docker Swarm

1.7 Mesos Marathon

Mesos就是实现分布式计算的框架,在分布式计算过程中,Mesos会对上述计算机资源(内存,CPU,网络IO等)进行管理和分配调度。

  • Mesos-master:协调全部的slave,并确定每个节点的可用资源,聚合计算跨节点的所有可用资源的报告,然后向注册到Master的Framework发出资源邀约。
  • Mesos-slave:向master汇报自己的空闲资源和任务的状态,负责管理本节点上的各个mesos-task,在framework成功向Master申请资源后,收到消息的slave会启动相应framework的exexutor
  • Framework:Hadoop,Spark等,通过MesosSchedulerDiver接入Mesos
  • Executor:执行器,用于启动计算框架中的task

Marathon是基于MesosFramework的开源框架, 就是一个基于mesos的编排工具,它通过与mesos-master通信,调用接口,实现通用的编排策略。 而Marathon自身又提供了接口,使得应用程序的部署得以更简单

1.8 K8S容器编排引擎

Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
  • 存储编排
    Kubernetes 允许自动挂载选择的存储系统,例如本地存储、公共云提供商等。
  • 自动部署和回滚
    可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
  • 自动完成装箱计算
    Kubernetes 允许指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
  • 自我修复
    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
  • 密钥与配置管理
    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

1.9 Docker Compose安装使用

第2章 服务容器化技术-Docker

2.1 Docker整体架构,功能介绍

  • Docker模块-客户端
    • docker 命令
    • docker API
  • Docker模块-服务器
    • Docker Daemon: dockerd
    • Docker Daemon配置文件(/etc/systemd/system/docker.service.d/ /etc/systemd/system/docker.service/ /lib/systemd/system/docker.service/)
  • Docker模块-镜像仓库
    • Docker Hub:Docker官方仓库
    • Docker Datacenter:Docker信任仓库
    • 私有仓库
  • Docker模块-镜像:静态的文件状态的“容器”
    • Docker commit:根据运行的容器,生成镜像
    • Dockerfile:根据文件,构建镜像
  • Docker模块-容器
    • 隔离-namespace(pid、net、ipc、mnt、uts)
    • 限制-cgroup(cpu、mem、io)
    • 文件系统-UnionFS(AUFS、btrfs、vfs、DeviceMapper)

2.3 Docker离线部署


2.4 Docker环境在线部署

安装教程一(亲试可用):

准备:
0.关闭防火墙 
systemctl stop firewalld

开始安装:
1.数据源准备、Docker CE下载安装    
sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

1.1.报错Could not resolve host: get.docker.com;
[root@localhost app]# vi /etc/resolv.conf
search  localdomain
nameserver 8.8.8.8 #google域名服务器
nameserver 8.8.4.4 #google域名服务器
nameserver 114.114.114.114 #国内第一个、全球第三个开放的全国通用DNS地址,可以为使用者提供高速、稳定、可信的DNS递归解析服务,延迟基本上在10ms以下
nameserver 223.6.6.6 #阿里DNS,延迟在25ms左右
nameserver 223.5.5.5 #阿里DNS

1.2.报错 "/etc/resolv.conf" E212: Can't open file for writing
sudo su  //切换root用户 

1.3 .centos 7 Docker容器启动报WARNING: IPv4 forwarding is disabled. Networking will not work
解决办法:
# vi /etc/sysctl.conf
或者
# vi /usr/lib/sysctl.d/00-system.conf
添加如下代码:
    net.ipv4.ip_forward=1

重启network服务
# systemctl restart network 

2.#Docker CE启动 
sudo service docker start

#3.修改普通用户docker权限
sudo gpasswd -a app docker

#4.修改阿里云镜像-镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://****.mirror.aliyuncs.com"] //阿里云注册后查看
}
EOF

#5.启动
sudo systemctl daemon-reload  //修改配置需要重刷daemon
sudo systemctl restart docker

安装教程二:
centos7安装Docker详细步骤(无坑版教程)

0.准备
//关闭防火墙 
 
//禁止防火墙开机自启 
systemctl disable firewalld.service

//关闭selinux   /etc/sysconfig/selinux
SELINUX=disabled

//重启 
reboot

1.通过 uname -r 命令查看你当前的内核版本,Docker 要求 CentOS 系统的内核版本高于 3.10 

2.使用 root 权限更新 yum 包(生产环境中此步操作需慎重,看自己情况,学习的话随便搞)
yum -y update

3.卸载旧版本(如果之前安装过的话)
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
4.安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

5.设置 yum 源(阿里仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6.查看可用版本有哪些
yum list docker-ce --showduplicates | sort -r

7.选择一个版本并安装:yum install docker-ce-版本号
yum install -y docker-ce-18.03.1.ce

ps:如有旧版本包冲突file /usr/bin/docker from install of docker-ce-18.03.1.ce-1.el7.centos.x86_6 ....
rpm -qa|grep docker  //查看
yum remove docker-ce-cli  //删除
yum -y install docker-ce-18.03.1.ce  //重装

8.启动并加入开机启动
systemctl start docker
systemctl enable docker

9.验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker -version  或者  docker -v

10.测试运行 hello-world, Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
docker run hello-world  

安装教程三(运维文档-亲测可用):

# 移除旧版本
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engin
 
# 配置仓库(阿里云)
$ wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果报错,无法链接,可以浏览器访问https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo,下载文件后上传到服务器/etc/yum.repos.d/
 
# 安装Docker
$ sudo yum install -y yum-utils
$ sudo yum install docker-ce docker-ce-cli containerd.io

# 如为自用项目,更换镜像仓库 
$ sudo cat << EOF > /etc/docker/daemon.json
{
  "registry-mirrors": ["https://****.mirror.aliyuncs.com"] //阿里云注册后查看
}
EOF
 
$ sudo systemctl daemon-reload  
$ sudo systemctl enable docker
$ sudo systemctl restart docker

2.5 Docker常用命令实战,容器生命周期

  • Docker Container-CURD
  • Docker Container-状态机模型
  • Docker Container-隔离与限制

  1. Docker服务相关命令
    • systemctl start docker
    • systemctl stop docker
    • systemctl restart docker
    • systemctl status docker
    • systemctl enble docker //设置开机启动docker服务

2.Docker镜像相关命令

  • docker images //查看本地所有镜像
  • docker images -q //查看本地所有镜像id
  • docker search 镜像名称 // 搜索镜像,从网络中
  • docker pull 镜像名称:版本号 //拉取镜像,不加版本号,默认最新版
  • docker rmi 镜像id // 删除指定本地镜像
  • docker rmi ‘docker images -q’ //删除本地所有镜像

3.Docker容器命令

  • docker run [可选参数] 镜像 –name 设置docker容器的名称 -d 在后台运行docker -it 使用交互的方式运行docker -p 执行容器的端口,如 -p 80:80 -P 随机指定端口
  • docker run -it –name=c1 centos:7 /bin/bash //创建容器并进入,exit退出容器关闭
  • docker run -id –name=c2 centos:7 //创建后台运行,exit退出容器不关闭
  • docker exec -it c2 /bin/bash //1.开个终端进去容器
  • docker exec -it c2 /bin/sh //2.开个终端进去容器
  • docker ps //查看正运行镜像
  • docker ps -a //查看所有镜像
  • docker stop 容器名称 //停止
  • docker start 容器名称 //启动
  • docker rm 容器名/容器id //删除容器,根据名或者id删除
  • docker ps aq //查看所有容器id
  • docker rm ‘docker ps aq’ //删除所有容器,正在运行的删除会报错,不让删
  • docker inspec 容器名称 //容器详细信息

2.6 Dockerfile实战-镜像制作实现项目部署

2.6.1 Dockfile作用

Dockfile是一个编写docker镜像生成过程,用于构建镜像的文件

2.6.2 Dockfile关键字

关键字 作用 备注
FROM 指定父镜像 指定dockerfile基于那个image构建
MAINTAINER 作者信息 用来标明这个dockerfile谁写的
LABEL 标签 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看
RUN 执行命令 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,”param2”]
CMD 容器启动命令 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,”param2”]
ENTRYPOINT 入口 一般在制作一些执行就关闭的容器中会使用
COPY 复制文件 build的时候复制文件到image中
ADD 添加文件 build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务
ENV 环境变量 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value
ARG 构建参数 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数
VOLUME 定义外部可以挂载的数据卷 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”]
EXPOSE 暴露端口 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp
WORKDIR 工作目录 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径
USER 指定执行用户 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户
HEALTHCHECK 健康检查 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制
ONBUILD 触发器 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大
STOPSIGNAL 发送信号量到宿主机 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
SHELL 指定执行脚本的shell 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell

2.6.3 Dockfile示例-构建spingboot镜像,并启动容器运行服务

1.打出业务包app-demo.jar,如果pom配置了docker-maven-plugin,则可以直接build出镜像并推送到指定docker主机中
mvn clean package

1.1 若报错:Failed to execute goal io.fabric8:docker-maven-plugin:0.35.0:build (docker-b…

修改pom,指定 <dockerHost>
<!-- docker插件 -->
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.35.0</version> 
                <configuration>
                    <!--指定远程 docker api地址-->
                    <dockerHost>http://192.168.145.229:2375</dockerHost>

1.2 Docker服务需开放2375端口,实现远程访问

1.查看docker.service路径
systemctl status docker.service

2.vi /lib/systemd/system/docker.service
在ExecStart行后面追加以下内容 
-H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

3.重新载入服务信息
systemctl daemon-reload

4.重启docker服务
systemctl restart docker.service

2.编写dockerfile

FROM java:8
MaINTAINER wds<wds.com>
EXPOSE 8080
ADD app-demo.jar
CMD java -jar app-demo.jar 

3.方式2:使用app-demo.jar、dockerfile手动构建镜像

docker build -f ./dockerfile -t app-demo:1 .

4.运行容器,端口映射、启动服务

docker run -id -p 8080:8080 app-demo:1

5.查看日志

docker logs -f 容器名称/容器id

6.下载日志

 docker cp fe9b0d3d23ee:/app/app-demo/logs /data/logs

2.8 Docker数据持久化管理-数据卷

数据卷特性

  • 宿主机的目录或文件,与容器目录绑的
  • 目录中的操作会立即同步
  • 一个数据卷可以被多个容器挂载
  • 一个容器也可以挂载多个数据卷

数据卷作用

  • 容器数据持久化
  • 外部机器和容器间通信
  • 容器之间数据交换

数据卷配置

  • docker run it –name=c1 -v 宿主机目录(/root/data):容器目录(/root/data-container) //创建容器时指定,使用绝对路径,不存在会自动创建

数据卷容器:创建一个数据卷容器挂载一个目录,其他容器继承改容器(–volume-from)

docker run -id --name=c3 -v /volume centos:7
docker run -id --name=c4 --volume-from c3 centos:7

2.9 实现容器间的网络访问和通信管理-端口映射

1.dockerfile中声明需要暴露的端口

EXPOSE 6379

2.运行镜像时,指定端口映射,将容器端口和宿主机端口做映射

docker run -id --name=c_redis -p 6379:6379 redis:5.0

2.10 如何进行主机内外部通讯方式比较和选型

2.11 如何选择最适合你的容器镜像仓库

2.12 Dockder生态圈:选型和优化

2.13 docker开启2375端口,提供外部访问docker服务

如研发,本地不装docker,可以统一适用开发环境的docker服务进行构建,运行

第3章 Docker应用部署示例

3.1、部署MySQL

1.搜索mysql镜像

docker search mysql

2.拉取mysql镜像

docker pull mysql:5.6

3.创建容器,设置端口映射、目录映射

# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/mysql
docker run -id \
-p 3307:3306 \
--name=c_mysql \
-v $PWD/conf:/etc/mysql/conf.d \
-v $PWD/logs:/logs \
-v $PWD/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.6
  • 参数说明:
    • -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
    • -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
    • -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
    • -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
    • -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

4.进入容器,操作mysql

docker exec –it c_mysql /bin/bash

5.使用外部机器连接容器中的mysql

3.2、部署Tomcat

1.搜索tomcat镜像

docker search tomcat

2.拉取tomcat镜像

docker pull tomcat

3.创建容器,设置端口映射、目录映射

# 在/root目录下创建tomcat目录用于存储tomcat数据信息
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name=c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat 
  • 参数说明:
    • -p 8080:8080:将容器的8080端口映射到主机的8080端口

      -v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps

4.使用外部机器访问tomcat

3.3、部署Nginx

1.搜索nginx镜像

docker search nginx

2.拉取nginx镜像

docker pull nginx

3.创建容器,设置端口映射、目录映射

# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}


docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
  • 参数说明:
    • -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
    • -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
    • -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录

4.使用外部机器访问nginx

3.4、部署Redis

1.搜索redis镜像

docker search redis

2.拉取redis镜像

docker pull redis:5.0

3.创建容器,设置端口映射

docker run -id --name=c_redis -p 6379:6379 redis:5.0

4.使用外部机器连接redis

./redis-cli.exe -h 192.168.149.135 -p 6379

第4章 Docker私有仓库搭建registry、Habor

4.1 私有仓库registry搭建

# 1、拉取私有仓库镜像 
docker pull registry

# 2、启动私有仓库容器 
docker run -id --name=registry -p 5000:5000 registry

# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功

# 4、修改daemon.json ,添加信任私有仓库地址
vim /etc/docker/daemon.json    
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip 
{"insecure-registries":["私有仓库服务器ip:5000"]} 

# 5、重启docker 服务 
systemctl restart docker
docker restart registry

4.2 将镜像上传至私有仓库

# 1、标记镜像为私有仓库的镜像     
docker tag centos:7 私有仓库服务器IP:5000/centos:7
 
# 2、上传标记的镜像     
docker push 私有仓库服务器IP:5000/centos:7

4.3 从私有仓库拉取镜像

#拉取镜像 
docker pull 私有仓库服务器ip:5000/centos:7

4.4 Registry配置账号密码

4.5 Habor仓库搭建

harbor安装过程并与k8s完成集成测试:https://baijiahao.baidu.com/s?id=1763522457885611514 https://github.com/tencentmusic/cube-studio/blob/master/install/kubernetes/harbor/readme.md

第5章 Docker network

docker在安装好会自带三个网络,通过docker network ls可以查看,分别为host、bridge、none。

  • host:与主机共用网络环境
  • bridge:网桥模式,docker安装启动后,会在宿主机创建一个名为docker0的虚拟网络接口(网桥),默认选择172.17.0.1/16网段,通过docker0与iptables nat表配置与宿主机通信,在这个模式下,连在同一网桥上的容器可以互相通信
  • none:无网络环境

在docker run创建容器时,可以指定–net参数来选择网络,默认使用bridge模式 

示例:

1.创建桥接网络
docker network create -d bridge test-net

2.启动时指定网络, 容器件可以互相通信
docker run -d -e PROFILE="dev" -p 1001:1001 --hostname demo-eureka-1  --name demo-eureka-1  --network test-net demo-eureka-1:1.2.0
docker run -d -e PROFILE="dev" -p 1002:1002 --hostname demo-config-1  --name demo-config-1  --network test-net demo-config:1.2.0

常用命令

docker ps
docker ps -a
docker images
docker build -t app-demo:1.0.0 -f *.docker  .
docker run -d -v /root/config:/root/config -p 8080:8080/tcp -p 18080-18089:18080-18089/udp –name app-demo registry.address/library/app-demo:1.0.0
docker logs -f --tail=50 d71c4d3bb038
docker login -u username -p pwd registry.address
docker tag registry.address1/library/app-demo:1.0.0 registry.address/library/app-demo:1.0.0
docker push registry.address/library/app-demo:1.0.0
docker pull registry.address/library/app-demo:1.0.0
docker cp fe9b0d3d23ee:/app/app-demo/logs /data/logs
docker exec -it c1 /bin/bash 
docker exec -it c2 /bin/sh  

cd /var/lib/docker/volumes

# 删除停止的容器、无用的镜像
docker rm $(docker ps -q -f status=exited)
docker rmi $(docker images -q -f dangling=true)
docker rmi $(docker images | grep "none" | awk '{print $3}')

# 查看各个docker服务 进程资源使用
docker stats

#docker save导出镜像
docker save 02e1fb6bb5a6 > server.tar

#docker load导入镜像
docker load < server.tar

#docker tag打标签
docker tag 02e1fb6bb5a6 hub.wds.com/demo/server:4.2.1

#推送到镜像仓库
docker push hub.wds.com/demo/server:4.2.1

问题记录

1.docker push 报错Get “https://ip:5000/v2/”: context deadline exceeded
一般是网络原因,telnet ip port是否通

2.docker push 报错http: server gave HTTP response to HTTPS client

vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["私有仓库服务器ip:5000"]}

# 重启docker 服务
systemctl restart docker
docker restart registry

Post Directory

扫码关注公众号:暂无公众号
发送 290992
即可立即永久解锁本站全部文章