Docker容器、镜像、仓库
参考资料
- Docker中文社区
- Docker部署PaddleOCR(CPU),别再踩坑了-咚咚锵嘿哈
- 慕课教程-第26周 服务容器化-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-隔离与限制
- 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.查看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