一、docker容器是什么及应用场景
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上。
——就是一个软件的打包技术
Docker容器就是在隔离的环境运行的一个进程,如果进程停止,容器就会退出,隔离的环境有自己的系统文件、IP地址、主机名等。
Docker主要应用场景:
1、程序打包和发布
2、持续集成
3、部署微服务
4、快速搭建测试环境
5、……
二、容器和虚拟化区别
总结:
容器:共用宿主机内核,轻量级,损耗少,启动快,性能高,只能运行Linux系统。
虚拟机:需要硬件的支持,需要模拟硬件,需要走开机启动流程,可以运行不同的操作系统
三、docker的安装
Docker在Ubuntu上支持最好,其他安装方法参考文档;
目前ubuntu有企业版和社区版,企业版收钱,社区版开源。
Ubuntu:(社区版)https://docs.docker.com/install/linux/docker-ce/ubuntu/
注:操作系统必须64位
我自己安装的过程命令(我是用root用户执行的,非root用户命令前加sudo):
#查看系统版本
uname -a
#清除已有的docker
apt-get remove docker
docker-engine docker.io containerd runc
#安装依赖包
apt-get install -y
apt-transport-https ca-certificates curl gnupg-agent software-properties-common
#添加官方秘钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
#添加版本库
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#更新缓存
apt-get update
#安装docker
apt-get install docker-ce
docker-ce-cli containerd.io
#检查安装版本
docker version
docker version查看:
可以看出,docker是c/s架构,go语音开发,源代码托管在Git仓库。
四、docker的主要组成部分
一个完整的docker有以下几个部分组成:
1.Docker Client客户端
2.Docker Daemon守护进程(服务端)
3.Docker Image镜像(容器的源代码,存放在docker仓库中)
4.Docker Container容器(通过镜像启动)
5.Docker Registry仓库(储存镜像,分为公有和私有)
五、docker的镜像管理
官方文档:https://docs.docker.com/engine/reference/commandline/image/
1、搜索镜像:docker search
选镜像尽量选官方或是星星高的
2、命令详解
常用的:
(1)将镜像打包:docker [image] save -o xx.tar 镜像名:版本号
(2)导入镜像包:docker [image] load --input **.tar
(3)指定镜像打tag:docker [image]source_image target_image
(4)推送镜像至仓库:docker [image] push imageName:版本
(5)从仓库拉去镜像:docker [image] pull imageName:版本
(6)删除镜像:docker image rm 镜像ID 或 docker rmi 镜像ID
六、docker的容器管理
1、docker容器的网络端口映射
docker容器的网络模式介绍:https://www.cnblogs.com/yy-cxd/p/6553624.html
默认网络模式下:docker:172.17.0.1 后面启动的容器IP范围:172.17.0.2/24
指定映射端口:docker run -p hostPort:containerPort 例如:要将容器里8080端口,映射到宿主机的8083端口,则-p 8083:8080
随机映射端口: -P(大写) 或 -p :containerPort
指定多个端口:-p hostPort:containerPort -p hostPort:containerPort
指定IP地址映射端口:ip:hostPort:containerPort
2、docker容器的数据持久化
常用的2种类型:
通过参数:-v 或—mount
1)将宿主机的目录作为数据持久化目录
-vhostDir:containerDir 或者—mount type=bind,source= hostDir,target= containerDir
如:docker run -d -it -v /home/docker/mysql/datadir: /var/lib/mysql -p 3306:3306 mysql:5.7
或者
docker run -d -it --mount type=bind,source=/home/docker/mysql/datadir,target=/var/lib/mysql -p 3306:3306 mysql:5.7
注:-v时,文件对文件hostFile:containerFile,目录对目录hostDir:containerDir。
此方式宿主机的内容会覆盖容器的内容。
2) 数据卷的形式:
a、创建一个卷docker volume create卷名
在/var/lib/docker/volumes下会多出一个目录
b、 不创建直接run,会生成一个卷,但是没有名字,难以管理
-v 卷名: containerDir 或者--mount type=volume,source 卷名,target= containerDir
如:docker run -d -it-v mysql_db: /var/lib/mysql -p 3306:3306mysql:5.7
或者
docker run -d -it --mount type=volume,source=卷名,target=/var/lib/mysql -p 3306:3306 mysql:5.7
3、docker容器常用命令
官方文档:https://docs.docker.com/engine/reference/commandline/docker/
注意:(docker image | docker container后跟命令 ) 都可在docker [options]中有对应的命令,通常习惯使用后者。
1、 启动容器docker run :运行一个mysql5.7容器:docker run == docker create && dockerstart
https://docs.docker.com/engine/reference/commandline/run/
#添加加速器
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
#重载器配置
systemctl daemon-reload
#重启docker
systemctl restart docker
#使docker开机自启动
systemctl enable docker
#运行一个mysql服务:
docker run --restart=always --name
mysql5.7 -p 3306:3306 -v /home/docker/mysql/datadir:/var/lib/mysql -v
/home/docker/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=test -d
mysql:5.7
-d 后台运行
-it 分配交互式的终端
--name 指定容器名字
--restart=always 容器自动容器
-e 环境变量
-p 映射端口
-v 磁盘挂载(文件对文件,目录对目录)
……
注:启动容器时,要有一个可以夯得住的启动命令才能把容器夯住。
2、进入容器:docker exec -it mysql5.7 bash (有自己的终端) docker attach mysql5.7(公用终端,能看到对方在干啥,退出对方也被退出),验证mysql是否可用。
3、 停止|启动|重启容器:docker stop 容器ID或容器名 && docker start容器ID或容器名 && docker restart容器ID或容器名
4、 删除容器(只能删除停止的容器):docker rm 容器ID或容器名
七、手动将容器保存镜像(制作一个有jdk的基础镜像)
很多时候我们需要定制化自己的镜像,且现在项目应用的基础环境基本是能确定的,比如很多官方镜像没有基础命令如ifconfig\ping\tail\less等,还有缺失运行环境,如java环境,maven环境等等,通过一次制作,之后到处使用。
下面我们就一步一步制作一个基于centos的jdk8的基础镜像。
步骤:
docker search centos
#先下载一个有jdk的基础镜像
docker pull centos
#启动镜像
docker run -d --name base centos
tail -f
#下载jdk8(64位Linux版的)
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
#将JDK8 cp到容器里
docker cp
jdk-8u231-linux-x64.tar.gz base:/opt
#进入容器
docker exec -it base bash
#解压jdk tar 设置环境变量
tar -zxvf jdk-8u231-linux-x64.tar.gz
vi ~/.bashrc
添加:
export JAVA_HOME=/opt/jdk1.8.0_231
export JRE_HOME=${JAVA_HOME}/jre
export
CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export
JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
#退出,使文件生效
source ~/.bashrc
#成功
java -version
#关键步骤来了,开始将我们的容器提交成镜像
docker commit base centos-jdk8:v1
#检查镜像,多了一个名为centos-jdk8版本为v1的镜像
docker images
#验证镜像,启动成功后进入容器,输入java -version,可以看到jdk版本
docker run -itd centos-jdk8:v1 tail -f
八、dockerfile自动构建容器(制作一个有jdk的基础镜像)
手动创建步骤繁杂,且步骤不可复用,使用dockerfile,调通一次之后,可以到处共享此dockerfile。
官方:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
步骤:
#创建一个文件夹,将jdk8的tar文件放到此目录下
mkdir jdk8
#载文件夹下创建一个dockerfile文件
vi dockerfile
#引入基础镜像
FROM centos
#注ADD命令会将压缩包解压
ADD jdk-8u231-linux-x64.tar.gz /opt
ENV JAVA_HOME=/opt/jdk1.8.0_231
ENV JRE_HOME=${JAVA_HOME}/jre
ENV CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
ENV JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
ENV PATH=$PATH:${JAVA_PATH}
#build dockerfile,(后面有个.)
docker build -t centos-jdk8:v2 .
#也可以直接通过RUN 在线安装,但是通过RUN跟着的命令必需是连续的,不需人为干预##的,例如 apt-get install net-tools就不行,必须apt-get install net-tools -y,而且每次使用#RUN相当于是重新起了个容器,所以有关联性的命令需要在一个RUN后面执行完
#验证
docker run -itd centos-jdk8:v2 tail -f
小试牛刀:在基础镜像中把maven、jenkins、Tomcat等任选打包进去,生成另一个基础镜像。
Maven地址:http://mirror.bit.edu.cn/apache/maven/maven-3/3.5.4/binaries/
Jenkins:https://jenkins.io/zh/download/
Tomcat:https://tomcat.apache.org/download-80.cgi
提示:需要镜像启动时执行命令,且是不能被替换的可用参数:ENTRYPOINT
如:ENTRYPOINT java ${JVM_OPTIONS} -jar application.jar
九、docker网络介绍
官网:
https://docs.docker.com/network/
1、自带网络类型
Docker run -d –network [网络类型]
1)bridge
此类型为默认类型
2)None
此类型不配置任何网络功能
3)Host
与宿主机共享网络,性能最优。
4)container
共享容器的网络
--network container:containerId
2、自定义网络-了解不太清晰
1) Macvlan
https://docs.docker.com/network/macvlan/
跨主机容器之间通信,可指定mac地址。但启动时需要制定IP。
a、宿主机1和宿主机2分别创建名为macvlan_t
dockernetwork create --driver macvlan --subnet 192.168.0.0/24 --gateway 192.168.0.1-o parent=eth0 macvlan_t
b、宿主机1和宿主机2分别使用macvlan_t网络启动容器
宿主1:docker run -d --name nginx2 --network macvlan_t --ip 192.168.0.100 nginx:t1
宿主2:docker run -d --name nginx2 --network macvlan_t --ip 192.168.0.101 nginx:t1
c、直接可以使用ssh连接到192.168.0.100和192.168.0.101访问此容器(前提是有ssh服务)
由于机器限制,无法进行验证,感兴趣可以自行演示
十、docker-compose(单机版的容器编排工具)
官方命令文档:https://docs.docker.com/compose/reference/
当部署的服务很多时,一个一个run容器效率很低,管理很麻烦,而使用docker-compose编排工具,可解决该痛点。
1、安装:
https://docs.docker.com/compose/install/
#安装
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o/usr/local/bin/docker-compose
#授权
chmod +x /usr/local/bin/docker-compose
#将可执行命令软连接到系统文件
ln -s /usr/local/bin/docker-compose/usr/bin/docker-compose
#查看版本
docker-compose -version
2、常用命令
官方文档:https://docs.docker.com/compose/reference/
-d后台执行
创建并启动所有容器:docker-compose up -d ==docker-compose create && docker-composestart
创建并启动指定容器:docker-compose up -d serviceName
停止并删除所以容器:docker-compose down
重启指定容器:docker-compose restart -d serviceName
创建并启动指定数量的容器:docker-compose scale serviceName=3
3、docker-compose.yml文件
官方文档:https://docs.docker.com/compose/compose-file/
#mysql的docker-compose.yml
version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "test"
restart: always
volumes:
-"/home/docker-compose/mysql/conf.d:/etc/mysql/conf.d"
-"/home/docker-compose/mysql/datadir:/var/lib/mysql"
ports:
- "3307:3306"
#保存后在compose文件又在目录下执行命令启动 如果要指定compose文件使用 docker-compose -f 指定compose.yml文件路径 up -d
docker-compose up -d mysql
十一、搭建docker registry
https://docs.docker.com/registry/deploying/
一般企业都会有自己的私有仓库,在局域网内管理自己的docker仓库,存放自己的镜像。我看大部分用的是harbor
#不带域名解析的简单搭建
docker run -itd -v /home/test/docker-compose/registry/data:/var/lib/registry -p 5000:5000 --name=registry registry:2
#验证
root@i-x5iqfwdu:~# curl http://localhost:5000/v2/_catalog
#显示如下,表明仓库已启动
{"repositories":[]}
#直接push报了个错,找不到,得先打tag,然后就能push了
root@i-x5iqfwdu:~# docker push localhost:5000/centos-jdk8:v2
The push refers to repository [localhost:5000/centos-jdk8]
An image does not exist locally with the tag:localhost:5000/centos-jdk8
root@i-x5iqfwdu:~# docker tag centos-jdk8:v2
localhost:5000/centos-jdk8:v2
root@i-x5iqfwdu:~# docker push localhost:5000/centos-jdk8:v2
The push refers to repository
[localhost:5000/centos-jdk8]
17741937a3e1: Pushed
9e607bb861a7: Pushed
v2: digest: sha256:e77313993d82fe1668034efd53b93411ea949b9714dc41d7347914db309463ba
size: 742
root@i-x5iqfwdu:~# curl http://localhost:5000/v2/_catalog
{"repositories":["centos-jdk8"]}
十一、总结(图)
十二、docker监控
监控CPU、内存、磁盘I/O、网络I/O使用情况。
1、 后台命令监控:
docker stats [容器]
2、其他方法
CADvsior监控+influxdb+grafana