文章目录
-
-
- 1.Docker容器化技术简介
-
- 1.1什么是Docker?
- 1.2.为什么要用docker?
- 2.Linux Centos7安装Docker
-
- 2.1.安装Docker
- 2.2.配置阿里云镜像加速
- 3.Docker镜像的搜索下载以及查看删除
-
- 3.1.什么是镜像?
- 3.2.查看本地镜像
- 3.3.搜索镜像
- 3.4.搜索镜像并过滤是官方的
- 3.5.搜索镜像并过滤大于10颗星的
- 3.6.下载centos7镜像
- 3.7.修改本地镜像名字
- 3.8.本地镜像的删除
- 3.9.Docker的体系结构之镜像与容器
- 4.Docker核心基础之容器的构建
- 5.Docker容器的文件复制与挂载
- 6.Docker核心自定义镜像
-
- 6.1.构建镜像的两种方法
- 6.2.Commit构件自定义镜像
- 6.3.DockerFile构建镜像
- 6.4.Docker镜像分层结构剖析
- 6.5.Dockerfile基础命令
- 6.6.Dockerfile构建Tomcat镜像
- 6.7.Dockerfile构建Nginx镜像
- 6.8.Dockerfile构建Redis镜像
- 6.9.Dockerfile构建Mysql镜像
- 7.Docker网络模式
-
- 7.1.Docker默认三种网络模式
- 7.2.Docker容器bridge模式
- 7.3.Docker容器host模式
- 7.4.Docker容器none模式
- 7.5.Docker容器间基于Link实现单项通信
- 7.6.Docker容器间利用bridge网桥实现双向通信
- 8.Docker容器特权模式
-
- 9.Docker容器Volume数据共享
-
- 9.1使用dockerfile进行数据共享
- 9.2使用volume容器共享创建nginx集群
- 10.Docker-Compose容器操作
-
- 10.1.Docker-Compose安装
- 10.2.Compose常用指令
- 10.3.Compose yml的常用配置
- 10.4.Docker-Compose搭建个人博客
- 10.5.Docker-Compose 详细分析
- 11.Docker镜像仓库实战
-
- 11.1.镜像仓库简介
- 11.2.阿里云镜像仓库的搭建与使用
- 11.3.企业核心之harbor仓库搭建
- 11.4.企业核心之harbor仓库配置和使用
- 11.5.本地镜像容器的载入与载出
1.Docker容器化技术简介
1.1什么是Docker?
- 一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口;
- 使用go语言编写,在LCX(linux容器)基础上进行封装
- 三点
- 快速部署应用启动
- 实现虚拟化,完整资源隔离
- 一次编写,四处运行
1.2.为什么要用docker?
- 提供一次性的环境,加入需要安装mysql,则需要安装很多依赖库、版本等,如果使用Docker则通过镜像就可以直接启动运行
- 快速动态扩容,使用docker部署了一个应用,可以制成镜像,通过docker快速启动
- 组件微服务架构,可以在一个机器上模拟出多个微服务,启动多个应用
- 更好的资源隔离和共享
2.Linux Centos7安装Docker
2.1.安装Docker
- 安装环境:Centos7
- 安装条件:docker官方至少要求3.8,建议3.10以上
- 查看centos内核版本
uname -a



2.2.配置阿里云镜像加速
- 新建文件:vi /etc/docker/daemon.json
- 编辑文件
{
"registry-mirrors": ["https://6j96rs65.mirror.aliyuncs.com"]
}
- 重启docker
- systemctl daemon-reload
- systemctl restart docker
3.Docker镜像的搜索下载以及查看删除
3.1.什么是镜像?
镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又恢复成许多文件,RAID 1和RAID 10使用的就是镜像。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。
3.2.查看本地镜像
docker images

3.3.搜索镜像
docker search centos

3.4.搜索镜像并过滤是官方的
docker search --filter "is-official=true" centos

3.5.搜索镜像并过滤大于10颗星的
docker search --filter stars=10 centos

3.6.下载centos7镜像
docker pull centos:7

3.7.修改本地镜像名字
docker tag mycentos:1 centos:7
3.8.本地镜像的删除
docker rmi centos:7
3.9.Docker的体系结构之镜像与容器
- 一个镜像可以启动无数台容器
- 容器与容器之间的操作互不影响,处于隔离的环境
4.Docker核心基础之容器的构建
- 构建容器:docker run -itd --name=mycentos centos:7
- -i:表示以交互模式运行容器(让容器的标准输入保持打开)
- -d:表示后台运行容器,并返回容器ID
- -t:为容器重新分配一个伪输入终端
- –name:为容器指定名称
- 查看本地所有容器:docker ps -a
- 查看本地正在运行的容器:docker ps
- 停止容器:docker stop CONTAINER_ID/CONTAINER_NAME
- 一次性停止所有容器:docker stop $(docker ps -a -q)
- 启动容器:docker start CONTAINER_ID/CONTAINER_NAME
- 重启容器:docker restart CONTAINER_ID/CONTAINER_NAME
- 删除容器:docker rm CONTAINER_ID/CONTAINER_NAME
- 强制删除容器:docker rm -f CONTINAER_ID/CONTINAER_NAME
- 查看容器详细信息:docker inspect CONTIANER_ID/CONTINAER_NAME
- 进入容器:docker exec -it CONTINAER_ID/CONTINAER_NAME /bin/bash
5.Docker容器的文件复制与挂载
- 从宿主机复制到容器:docker cp 宿主机本地绝对路径 容器名字/ID:容器绝对路径
- docker cp /root/1.txt mycentos:/root/
- 从容器复制到宿主机:docker cp 容器ID/NAME:容器绝对路径 宿主机绝对路径
- docker cp mycentos:/root/2.txt /root/
- 宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 --name 容器名称 镜像ID
- docker run -itd -v /root/test/:root/ --name=centos7 centos:7
6.Docker核心自定义镜像
6.1.构建镜像的两种方法
- 基于Docker Commit制作镜像
- 基于DockerFile制作镜像,DockerFile方式为主流的制作镜像方式
6.2.Commit构件自定义镜像
- 启动容器:docker run -itd mycentos
- 进入容器:docker exec -it mycentos /bin/bash
- 安装ifconfig命令:yum -y install net-tools
- 重启容器:docker restart mycentos
- 删除容器:docker rm mycentos
- 构件镜像:docker commit -a “作者” -m “描述” 原CONTAINER_ID 新容器image
- docker commit -a “lixiang” -m “ifconfig命令” 180176be1b4c centos7:v1
- -a:指定作者
- -m:描述
- 产看容器详情:docker insecpt 180176be1b4c
- 启动容器:docker run -itd 180176be1b4c
6.3.DockerFile构建镜像
FROM centos:7
MAINTAINER lixiang
RUN echo "正在构建镜像!!!"
WORKDIR /root/lixiang
COPY 123.txt /root/lixiang
RUN yum -y install net-tools
- 构件镜像:docker bulid -t mycentos:v2 .
6.4.Docker镜像分层结构剖析


- 总结:
- 共享资源
- 对容器的任何改动都不会影响镜像层
- 容器层可读可写,镜像层只读
6.5.Dockerfile基础命令
- FROM
- MAINTAINER
- COPY
- 复制宿主机文件到镜像中(只能用相对路径,绝对路径会报错)
- ADD
- 复制宿主机文件到镜像中(加入文件是.tar.gz,他会帮解压到指定目录)
- WORKDIR
- ENV
- EXPOSE
- RUN
- ENTRYPOINT
- 容器启动的时候执行,作用于容器层,dockerfile里面有多条时只执行最后一条
- CMD
- 在容器启动的时候执行,作用于容器层,dockerfile里面有多条时只执行最后一条
- 容器启动后执行默认的命令或参数,允许被修改
- 命令格式
- shell命令格式:RUN yum -y install net-tools
- exec命令格式:RUN [ “yum”,“-y”,“install”,“net-tools” ]
- 测试
- 第一个dockerfile
FROM centos:7
RUN echo "images building!"
CMD ["echo","container","starting..."]
ENTRYPOINT ["echo","container","starting !!!"]

FROM centos:7
RUN echo "images building!"
CMD ["echo","containe1r","starting..."]
CMD ["echo","container2","starting..."]
ENTRYPOINT ["echo","container2","starting !!!"]
ENTRYPOINT ["echo","container2","starting !!!"]

FROM centos:7
CMD ["-ef"]
ENTRYPOINT ["ps"]

6.6.Dockerfile构建Tomcat镜像
6.7.Dockerfile构建Nginx镜像
- nginx_install.sh脚本编写
- touch nginx_install.sh ; chmod u+x nginx_install.sh ; vi nginx_install.sh
- #!/bin/bash
- yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
- cd /usr/lcoal/nginx
- ./configure --prefix=/user/local/nginx && make && make install
- dockerfile文件编写
- vi dockerfile
- #dockerfile安装nginx镜像
- FROM centos:7
- ADD nginx-1.16.0.tar.gz /usr/lcoal
- COPY nginx_install.sh /usr/local
- RUN /usr/local/nginx_install.sh
- EXPOSE 80
- 启动容器
- docker run -itd 80:80 centos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
6.8.Dockerfile构建Redis镜像
- 编写redis编译安装shell脚本 redis_install.sh
- #!/bin/bash
yum install -y gcc gcc-c++ make openssl openssl-devel
cd /usr/local/redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/conf
cp /usr/local/redis-4.0.9/redis.conf /usr/local/redis/conf/
sed -i ‘69s/127.0.0.1/0.0.0.0/’ /usr/local/redis/conf/redis.conf
sed -i ‘88s/protected-mode yes/protected-mode no/’ /usr/local/redis/conf/redis.conf
- 编写dockerfile
- #dockerfile部署redis镜像
FROM centos:7
ADD redis-4.0.9.tar.gz /usr/local/
COPY redis_install.sh /usr/local/
RUN sh /usr/local/redis_install.sh
ENTRYPOINT [“/usr/local/redis/bin/redis-server”,“/usr/local/redis/conf/redis.conf”]
- 执行dockerfile :docker build -t centos:redis .
- 启动容器:docker run -itd -p 6379:6379 centos:redis /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
- 进入容器:docker exec -it 9b402baeaba7 /bin/bash
6.9.Dockerfile构建Mysql镜像
- 拉取mysql:5.7镜像
- 编写dockerfile文件基于5.7mysql再创镜像
- FROM mysql:5.7
- WORKDIR /docker-entrypoint-initdb.d
- ENV LANG=C.UTF-8
- ADD init.sql
- 构建镜像:docker build -t mysql_new:5.7 .
- 启动镜像:docker run -itd --name=mysql_5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql_new:5.7
7.Docker网络模式
7.1.Docker默认三种网络模式
- bridge:桥接模式
- host:主机模式
- none:无网络模式
查看网络模式:docker network ls

7.2.Docker容器bridge模式

- 宿主机安装bridge-utils工具
- yum -y install bridge-utils



NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术,如下图所示。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。

7.3.Docker容器host模式
- host模式:该模式下容器是不会拥有自己的IP地址,而是使用宿主的ip地址和端口。

- 启动nginx容器命令并防火墙放开80端口
- docker run -d --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
- firewall-cmd --zone=public --add-port=80/tcp --permanent
- firewall-cmd --reload
7.4.Docker容器none模式
- none模式无法连接外网,一般用于测试用,基本不怎末使用
7.5.Docker容器间基于Link实现单项通信
- 实现单向通信通过 “–link 容器名” 来指定,在需要向其他容器通信的容器上加上–link
- Docker容器桥接模式每次启动都是随机分配ip,当容器挂掉,ip重变,所以要指定容器名
- 注意:要先启动被通信的容器,否则–link 找不到容器名会报错
- 启动数据库容器:docker run -itd --name=mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 在启动centos:docker run -itd --name mycentos --link mydb centos:5.7


7.6.Docker容器间利用bridge网桥实现双向通信

- 启动第一个容器:docker run -itd --name=centos1 centos:7
- 启动第二个容器:docker run -itd --name=centos2 centos:7
- 把第一个容器加入到网桥:docker network connect my_bridge centos1
- 把第二个容器加入到网桥:docker network connect my_bridge centos2
- 验证两个容器是否可以相互ping通


8.Docker容器特权模式
8.1Docker容器特权模式

- 以特权模式启动容器
- docker run -itd --name=centos2 --privileged=true centos:7
- 重复上面操作删除网关

9.Docker容器Volume数据共享
9.1使用dockerfile进行数据共享
FROM centos:7
VOLUME ["/usr/local"]
执行dockerfile后就会将容器的usr/local下的内容映射到宿主机var下的随机文件夹而且不能改变
9.2使用volume容器共享创建nginx集群
- 使用**–volumes-from**实现容器于容器之间的共享
- 创建nginx1
- docker run -itd -v /nginx/html/:usr/local/nginx/html/ -p 8080:80 --name=nginx1 centos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
- 创建nginx2
- docker run -itd -p 8081:80 --volumes-from nginx1 --name=nginx2 centos:nginx /usr/local/nginx/sbin.nginx -g “daemon off;”
- 创建nginx3
- docker run -itd -p 8081:80 --volumes-from nginx1 --name=nginx3 centos:nginx /usr/local/nginx/sbin.nginx -g “daemon off;”
- 浏览器访问,查看挂载信息


10.Docker-Compose容器操作
10.1.Docker-Compose安装
curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod u+x /usr/local/bin/docker-compose
docker-compose --version
10.2.Compose常用指令
- 编写简单的docker-compose.yml文件
version: '3'
services:
redis:
image: centos:redis
- 运行docker-compose.yml文件:docker-compose up -d(后台运行)
- 查看容器运行情况:docker-compose ps
- 删除容器:docker-compose down
- 删除容器并且删除volumes:docker-compose down --volumes
- 停止启动容器:docker-compose stop
- 进入容器:docker-compose exec redis bash
注意:要在有docker-compose的目录下执行docker-compose up -d
10.3.Compose yml的常用配置
-
docker-compose.yml的三大部分:version(yml的版本)、services(容器服务)、networks(网络模式)
-
compose设置网络模式:network_mode: “网络模式”(host、nono、bridge)
-
compose设置端口映射:
-
host:
- "宿主机端口:容器端口"
-
compose设置文件共享
-
volumes:
- "宿主机路径:容器路径"
-
compose设置额外参数
command: /usr/local/nginx/sbin/nginx -g "daemon off;"
-
编写docker-compose.yml文件
version: '3'
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
redis:
image: redis:latest
ports:
- "6379:6379"
- 检验本机端口占用情况:
- ps -ef | grep nginx
- netstat -tunlp | grep 进程号
10.4.Docker-Compose搭建个人博客
version: "3.2"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
- 运行docker-compose.yml
- docker-compose up -d
- docker-compose down:删除容器和网络,会保留wordpress数据库
- docker-compose --volumes:全部删除
10.5.Docker-Compose 详细分析
version: "3.2"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
11.Docker镜像仓库实战
11.1.镜像仓库简介
- 什么是镜像仓库
- 为什么要使用镜像仓库
- 镜像仓库的种类
- 公共镜像仓库
- 官方:https://hub.docker.com/,基于各个软件开发或者有软件提供商开发的
- 非官方:其他组织或者公司开发的镜像,供大家免费使用
- 私有镜像仓库
- 公司自己搭建的,用于存放公司内部的镜像,自己管理,不提供给外部使用,避免了商业项目暴露出去的风险。

11.2.阿里云镜像仓库的搭建与使用




docker login --username=李祥asdds registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lixiang19_test/mysql:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/lixiang19_test/mysql:[镜像版本号]
docker pull registry.cn-hangzhou.aliyuncs.com/lixiang19_test/mysql:[镜像版本号] (注意先登录阿里云镜像仓库)
11.3.企业核心之harbor仓库搭建
- 前置环境:docker、docker-compose、openssl、python2.7以上
- 上传harbor压缩包解压:tar -xvf harbor…
- 修改配置:harbor.yml
- 修改主机名(注意空格):hostname: 192.168.0.151
- 修改密码(注意空格):harbor_admin_password: Harbor12345
- 进入到解压包里执行脚本prepare
- 执行完prepare脚本,会生成docker-compose.yml文件,执行 sh install.sh脚本
- 访问Harbor,默认用户名admin
- 访问默认是80端口

11.4.企业核心之harbor仓库配置和使用
- 配置使用docker仓库
- 默认docker只允许访问https仓库
- 如果要访问http的仓库需要自己配置
- 配置允许访问http仓库:/etc/docker/daemon.json
{
"insecure-registries":["http://192.168.0.151"]
}
- 重启docker服务:systemctl restart docker
- 创建自己的仓库名
- 登录 docker login --username=admin 192.168.10.105
- 打包镜像:docker tag 容器id 192.168.0.105/xdclass/mysql:5.7
- 上传docker镜像:docker push 192.168.10.105/xdclass/mysql:5.7
- 拉取docker镜像:docker pull 192.168.10.105/xdclass/mysql:5.7
- 登出:docker logout
- 注意:docker login后会有一个登录凭证(可删除,下次需要密码):/root/.docker/config.json
11.5.本地镜像容器的载入与载出
-
两种办法:
-
保存镜像:
- docker save 镜像ID -o /usr/local/镜像名称.jar
-
载入镜像
-
保存容器
- docker export 容器ID -o /usr/local/容器名称.jar
-
载入容器
-
微服务打包docker镜像
- 最外层 mvn clean install
- 子项目:mvn install -Dmaven.test.skip=true dockerfile:build
- 启动:docker run --name 容器名字 -d -p 端口映射 镜像id