Docker介绍和使⽤场景
官⽹:https://www.docker.com/get-started
介绍
-
百科:⼀个开源的应⽤容器引擎,让开发者可以打包他们 的应⽤以及依赖包到⼀个可移植的容器中,然后发布到 任何流⾏的 Linux 机器上,也可以实现虚拟化。
-
容器是完全使⽤沙箱机制,相互之间不会有任何接⼝, 使⽤go语⾔编写,在LCX(linux容器)基础上进⾏的封 装
-
简单来说:
- 就是可以快速部署启动应⽤
- 实现虚拟化,完整资源隔离 ⼀次编写,四处运⾏
- 但有⼀定的限制,⽐如Docker是基于Linux 64bit 的,⽆法在32bit的linux/Windows/unix环境下使⽤
优点
- 提供⼀次性的环境,假如需要安装Mysql,则需要安装 很多依赖库、版本等,如果使⽤Docker则通过镜像就 可以直接启动运⾏
- 快速动态扩容,使⽤docker部署了⼀个应⽤,可以制作成镜像,然后通过Dokcer快速启动
- 组建微服务架构,可以在⼀个机器上模拟出多个微服 务,启动多个应⽤
- 更好的资源隔离和共享
- 开箱即⽤,快速部署,可移植性强,环境隔离
Linux安装Docker
注意:
# docker 需要在centOS7-64位上安装
hostnamectl | grep -i kernel
hostnamectl
uname -srm
uname -a
# 检查 系统版本
yum安装
参考:https://blog.csdn.net/u014069688/article/details/100532774
# 更新yum源
yum update
# 安装epel源
yum install epel-release -y
# 清除yum缓存
yum clean all
# 查看所有可安装的包(可不执行)
yum list
# 检查Linux上是否安装docker
yum list installed | grep docker
# 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加(中央仓库)
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo
# 查看docker版本
yum list docker-ce --showduplicates | sort -r
# 选择版本安装
yum install docker-ce-18.03.1.ce -y
# 启动
systemctl start docker
# 检查安装结果
docker info
# 启动使⽤Docker
systemctl start docker #运⾏Docker守护进程
systemctl stop docker #停⽌Docker守护进程
systemctl restart docker #重启Docker守护进程
centOS 7遇见问题
Error: Package: 3:docker-ce-19.03.13-3.el7.x86_64 (docker-ce-stable)
Requires: libseccomp >= 2.3
Installed: libseccomp-2.2.1-1.el7.x86_64 (@el7_yum)
libseccomp = 2.2.1-1.el7
Error: Package: 3:docker-ce-19.03.13-3.el7.x86_64 (docker-ce-stable)
Requires: container-selinux >= 2:2.74
Error: Package: containerd.io-1.3.7-3.1.el7.x86_64 (docker-ce-stable)
Requires: container-selinux >= 2:2.74
# 解决
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum install epel-release -y
yum install container-selinux -y
阿里云安装文档:
https://help.aliyun.com/document_detail/51853.html?spm=a2c4g.11186623.6.820.RaToNY
离线安装(没测)
# wget下来 或其他方式
wget http://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
# tar解压
tar -zxvf docker-18.06.3-ce.tgz -C ../services/
# 进入docker bin目录
cp docker/* /usr/bin/
在/etc/systemd/system/目录下新增docker.service文件,内容如下,这样可以将docker注册为service服务
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --selinux-enabled=false --insecure-registry=127.0.0.1
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
此处的–insecure-registry=127.0.0.1(此处改成你私服ip)设置是针对有搭建了自己私服Harbor时允许docker进行不安全的访问,否则访问将会被拒绝。
# 给docker.service文件添加执行权限
chmod +x /etc/systemd/system/docker.service
# 重新加载配置文件(每次有修改docker.service文件时都要重新加载下)
systemctl daemon-reload
# 启动
systemctl start docker
# 设置开机启动
systemctl enable docker.service
# 查看docker服务状态
systemctl status docker
# active(running)成功
Dokcer基础知识
概念:
- Docker 镜像 - Docker images:容器运⾏的只读模 板,操作系统+软件运⾏环境+⽤户程序
就像javabeen类
- Docker 容器 - Docker containers:容器包含了某个应 ⽤运⾏所需要的全部环境
就像java new对象
-
Docker 仓库 - Docker registeries: ⽤来保存镜像,有 公有和私有仓库,好⽐Maven的中央仓库和本地私服
-
总结 对⽐⾯向对象的⽅式
Dokcer ⾥⾯的镜像 : Java⾥⾯的类 Class
Docker ⾥⾯的容器 : Java⾥⾯的对象
Object 通过类创建对象,通过镜像创建容器
Docker容器常⻅命令
-
docker search [镜像名称]
: 查看网上已有镜像 -
docker images
:列出当前系统存在的镜像 -
docker pull [镜像名称]
拉取镜像网上镜像
镜像名称:(格式 REPOSITORY : TAG)
REPOSITORY:表示镜像的仓库源,
TAG:镜像的标签
- 运⾏⼀个容器:
docker run --name nginx-xd -p 8080:80 -d nginx
# docker run 运⾏⼀个容器
# -d +后台运⾏
# -p +端⼝映射
# --name +容器名称
-
docker ps
: 列举当前运⾏的容器 -
docker inspect [容器名称]
检查容器内部信息 -
docker rmi [IMAGE_NAME]
删除镜像
强制移除镜像不管是否有容器使⽤该镜像 增加 -f 参数
-
docker stop [容器名称]
停⽌某个容器 -
docker start [容器名称]
启动某个容器 -
docker rm [容器名称]
移除某个容器 (容器必须是停⽌状 态) -
docker ps -a
列举全部 容器 -
docker logs -f containerid
查看容器启动⽇志
Docker仓库的知识
Docker公有+阿里云私有镜像仓库
官⽅公共镜像仓库和私有镜像仓库(画图)
- 公共镜像仓库:
官⽅:https://hub.docker.com/
,基于各个软件开 发或者有软件提供商开发的
⾮官⽅:其他组织或者公司开发的镜像,供⼤家免 费试⽤
-私有镜像仓库:
⽤于存放公司内部的镜像,不提供给外部试⽤;
开通阿⾥云私有镜像仓库
登录阿⾥云账号访问地址:
https://cr.console.aliyun.com/
https://cr.console.aliyun.com/cn-shenzhen/instances/credentials
- 初次使⽤会提示开通
AlibabaCloud微服务本地镜像打包 配置讲解
微服务Docker镜像打包讲解
官⽅⽂档:https://spring.io/guides/gs/spring-boot-docker/
- 父项目添加
springboot
版本属性
<properties>
<springboot.version>2.3.3.RELEASE</springboot.version>
</properties>
- 子项目添加镜像前缀
<properties>
<docker.image.prefix>[自己定义]</docker.image.prefix>
</properties>
- 子项目添加maven插件
<build>
<finalName>[子项目名称]</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.10</version>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
</plugins>
</build>
<!--
${project.build.finalName} 产出物名称,缺省为
${project.artifactId}-${project.version}
-->
- 添加镜像打包脚本
# 创建Dockerfile,默认是根⽬录,(可以修改为src/main/docker/Dockerfile,如果修则需要制定路径)
# Dockerfile是由⼀系列命令和参数构成的脚本,这些命令应⽤于基础镜像, 最终创建⼀个新的镜像
# [内容]:
FROM adoptopenjdk/openjdk8:ubi
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# [讲解]:
# FROM <image>:<tag> 需要⼀个基础镜像,可以是公共的或者是私有的,
# 后续构建会基于此镜像,如果同⼀个Dockerfile中建⽴多个镜像时,可以使⽤多个FROM指令
# VOLUME 配置⼀个具有持久化功能的⽬录,
# 主机/var/lib/docker ⽬录下创建了⼀个临时⽂件,
# 并链接到容器的/tmp。改步骤是可选的,如果涉及到⽂件系统的应⽤就很有必要了。
# /tmp⽬录⽤来持久化到 Docker 数据⽂件夹,
# 因为Spring Boot 使⽤的内嵌 Tomcat 容器默认使⽤/tmp作为⼯作⽬录
# ARG 设置编译镜像时加⼊的参数, JAR_FILE 是设置容器的环境变量(maven⾥⾯配置的)
# COPY : 只⽀持将本地⽂件复制到容器 ,还有个ADD更强⼤但复杂点
# ENTRYPOINT 容器启动时执⾏的命令
# EXPOSE 8080 暴露镜像端⼝
- 构建镜像( 去到⼦模块pom⽂件下)
mvn install -Dmaven.test.skip=true
dockerfile:build