容器化引擎/管理
开源的容器引擎,它可以帮助我们更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可减少从编写到部署运行代码的周期。
应用场景
概念 | 说明 |
---|---|
Docker daemon(Docker守护进程) | Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。我们可通过Docker客户端与之通信。 |
Client(Docker客户端 | Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。图中,docker build等都是Docker的相关命令。 |
Images(Docker镜像) | Docker镜像是一个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像——我们使用系统安装光盘安装系统,同理,我们使用Docker镜像运行Docker镜像中的程序。 |
Container(容器) | 容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。我们可通过Docker API或者CLI命令来启停、移动、删除容器。 |
Registry(仓库) | Docker Registry是一个集中存储与分发镜像的服务。我们构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,我们就需要手动拷贝。此时,我们可借助Docker Registry来避免镜像的手动拷贝。一个Docker Registry可包含多个Docker仓库;每个仓库可包含多个镜像标签;每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。 |
yum install -y docker-ce-18.06.2.ce-3.el7.x86_64.rpm
docker info
以阿里云为例, 注册登录阿里云账号并访问
配置镜像加速器
通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,以下为linux指令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://yzb87oam.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
查看是否配置成功
docker info
systemctl start docker
systemctl stop docker
systemctl daemon-reload
systemctl status docker
docker search tomcat
(以搜索tomcat为例)docker pull 镜像名称:版本
docker images
docker rmi 镜像名:版本号
docker rmi 镜像ID
docker save -o 保存文件路径 镜像名:版本号
docker save -o /root/centos.tar centos:centos7
docker load -i 镜像文件路径
docker run -dti --name=命名 镜像名:版本号 /bin/bash
docker run -di --name=命名 -p 宿主机端口:容器端口 镜像名:版本号
docker ps
docker ps -a
docker ps -a -q
docker stop 容器名或容器id
docker stop $(docker ps -q)
docker start 容器名或容器id
docker kill 容器名或容器id
docker restart 容器名或容器id
docker exec -it 容器名 /bin/bash
exit
docker cp 文件路径 容器名:容器路径
docker cp 容器名:文件路径 宿主机路径
docker run -di --name=自定义命名 -v 容器下的目录 --privileged 容器名:容器版本
docker rm 容器名称或容器id
docker rm $(docker ps -a -q)
docker inspect 容器名称
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称
docker logs 容器名称
docker logs --tail="2" n1
docker pull java:8
docker run -di --name=jdk1 java:8
docker exec -it jdk1 /bin/bash
java -version
拉取MySQL镜像
docker pull mysql:5.7
创建MySQL容器
docker run -d --name=mysql1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=scwdb mysql:5.7
解决中文乱码问题
进入 mysql1 容器 修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnf
将文件拷贝到宿主机
docker cp mysql1:/etc/mysql/mysql.conf.d/mysqld.cnf /root/
修改配置文件 vi mysqld.cnf
并保存
找到[mysqld] 在其下添加 编码处理
character-set-server=utf8
collation-server=utf8_general_ci
将修改后的文件从宿主机拷贝回容器
docker cp /root/mysqld.cnf mysql1:/etc/mysql/mysql.conf.d/mysqld.cnf
重启容器
docker restart mysql1
docker pull redis:4.0.8
docker run -di --name=redis1 -p 16379:6379 redis:4.0.8
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者 |
ENV key value | 设置环境变量 (可以写多条),可以在创建容器的时候传递参数给容器 |
RUN command | 是Dockerfile的核心部分,执行系统指令(可以写多条) |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录 |
CMD | 指定容器启动时运行的命令 |
docker run -dti --name=centso1 centos:centos7 /bin/bash
创建一个目录:
mkdir /usr/local/dockerjdk
上传jdk-8u131-linux-x64.tar.gz到 /usr/local/dockerjdk/
创建一个Dockerfile文件,编辑并保存
vi Dockerfile
内容如下
FROM centos:centos7
MAINTAINER danny
RUN mkdir /usr/local/java
ADD jdk-8u131-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_131
ENV CLASSPATH $JAVA_HOME/lib
ENV PATH $JAVA_HOME/bin:$PATH
创建镜像 为jdk1.8
docker build -t='jdk1.8' /usr/local/dockerjdk/
查看已经创建的镜像
docker images
使用自定义的镜像创建一个容器
docker run -di --name=java1 jdk1.8
查看创建的容器
docker ps
进入容器并验证自定义容器jdk环境是否正常
docker exec -it java1 /bin/bash
java -version
创建目录
mkdir /usr/local/dockertomcat
上传jdk tomcat到目录中
创建Dockerfile,编辑并修改
vi DockerFile
内容如下
FROM centos:centos7
MAINTAINER danny
RUN mkdir /usr/local/app
ADD jdk-8u131-linux-x64.tar.gz /usr/local/app/
ADD apache-tomcat-8.5.15.tar.gz /usr/local/app/
ENV JAVA_HOME /usr/local/app/jdk1.8.0_131
ENV CATALINA_HOME /usr/local/app/apache-tomcat-8.5.15
ENV CLASSPATH $JAVA_HOME/lib
ENV PATH $JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
EXPOSE 8080
CMD ["/usr/local/app/apache-tomcat-8.5.15/bin/catalina.sh","run"]
创建镜像
docker build -t='tomcat8.5:10' .
查看镜像
docker images
创建容器
docker run -di --name=tomcat1 -p 5555:8080 tomcat8.5:10
查看容器
docker ps
测试是否安装成功
http://192.168.188.132:5555/
编写docker配置文件
vi /usr/lib/systemd/system/docker.service
找到以ExecStart开头的行,改成
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
刷新docker守护进程
systemctl daemon-reload
重启docker服务
systemctl restart docker
开启linux服务器的2375的防火墙端口
firewall-cmd --add-port=2375/tcp --permanent
firewall-cmd --reload
测试远程连接是否可以
模块mian文件下创建目录docker创建文件Dockerfile
#1.依赖基础镜像
FROM jdk1.8
MAINTAINER danny
ADD scw-register-*.jar /app.jar
#配置环境变量,接收外部传递参数
ENV PORT=""
#注册中心地址
ENV EUREKA=""
#默认端口(可不写)
EXPOSE 8888
#配置容器启动后执行的命令
ENTRYPOINT ["sh","-c","java -jar $PORT $EUREKA /app.jar"]
application.yml注释以下代码支持集群(默认为true)
# register-with-eureka: false #此EurekaServer不在注册到其他的注册中心
# fetch-registry: false #不在从其他中心中心拉取服务器信息
修改pom.xml支持Maven Docker插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>0.4.13version>
<configuration>
<imageName>danny/scw-register:0.0.1imageName>
<dockerDirectory>${project.basedir}/src/main/dockerdockerDirectory>
<dockerHost>http://192.168.188.132:2375dockerHost>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
configuration>
plugin>
plugins>
build>
在虚拟机中配置java maven环境
服务器导入maven,jdk的压缩包,解压并复制到/user/local/下,重命名maven与jdk1.8
tar -xvf xxx.tar.gz -C /usr/local
配置maven,jdk环境变量
修改配置文件
vi /etc/profile
内容如下
# java
export JAVA_HOME=/usr/local/jdk1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# maven
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
使配置文件生效
source /etc/profile
查看Maven版本号
mvn -v
修改maven配置文件 settings.xml并保存
在当前目录下的 maven-3.3/conf/settings.xml
内容如下
.....
<localRepository>E:/java/repolocalRepository>
.....
<mirrors>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
...
<profiles>
<profile>
<id>jdk1.8id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>1.8jdk>
activation>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
properties>
profile>
profiles>
.....
settings>
执行编译打包构建docker镜像指令
创建目录/usr/local/dockersrc
将springboot项目整体clean并上传到Linux /usr/local/dockersrc
工具类打jar包,不用生成镜像,进入该模块目录
mvn clean install -Dmaven.test.skip
注册中心模块,生成镜像,进入该模块目录(其他模块相同)
mvn clean package -Dmaven.test.skip=true docker:build
查看镜像
docker images
创建docker网络
本次需要创建一个用户自定义网络:
Docker网格创建指令:
docker network create mynet
查看docker网络指令:
docker network ls
创建运行docker容器(两种方式推荐第二种)
可以直接在docker服务器端输入docker指令来创建镜像
注册中心1,容器创建指令:
docker run -di --name=scw-register1 --network=mynet -e PORT="-Dserver.port=8761" -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register2:8762/eureka" -p 8761:8761 danny/scw-register:0.0.1
解释
docker run #创建容器指令
-di # d守护式容器i 运行容器
--name=scw-register1 # 容器名称
--network=mynet #容器加入用户自定义网络mynet
PORT="-Dserver.port=8761" #指定环境参数--Eureka注册中心服务启动监听端口
#指定环境参数--Eureka注册中心地址(高可用架构)
-e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register2:8762/eureka"
-p 8761:8761 #容器端口号映射
danny/scw-register:0.0.1 #镜像名称
注册中心2,容器创建指令:
docker run -di --name=scw-register2 --network=mynet -e PORT="-Dserver.port=8762" -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register1:8761/eureka" -p 8762:8762 danny/scw-register:0.0.1
解释
docker run #创建容器指令
-di # d守护式容器i 运行容器
--name= scw-register2# 容器名称
--network=mynet #容器加入用户自定义网络mynet
-e PORT="-Dserver.port=8762" #指定环境参数--Eureka注册中心服务启动监听端口
#指定环境参数--Eureka注册中心地址(高可用架构,互相指向对方)
-e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register1:8761/eureka"
-p 8762:8762 #容器端口号映射
danny/scw-register:0.0.1 #镜像名称
db1 数据库,容器创建指令: (注意创建容器后需要修改配置文件解决中文乱码问题)
docker run -di --name=db1 --network=mynet -p 3306:3306 -v /root/scwdb.sql:/docker-entrypoint-initdb.d/mysql.sql -v /root/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=scwdb mysql:5.7
解释
docker run
-di
--name=db1
--network=mynet
-p 3306:3306
-v /root/atcrowdfunding.sql:/docker-entrypoint-initdb.d/mysql.sql #导入结构及数据
-v /root/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf #配置解决中文乱码问题
-e MYSQL_ROOT_PASSWORD=root #mysql数据库密码
-e MYSQL_DATABASE=atcrowdfunding #初始化mysql数据库
mysql:5.7 #镜像名称
myredis 缓存, 容器创建指令:
docker run -di -p 6379:6379 --name=myredis --network=mynet redis:4.0.8
其他模块同注册中心(web模块举例)
docker run -di --name=scw-web --network=mynet -e PORT="-Dserver.port=10000" -e APPLICATION="-Dspring.application.name=SCW-WEB" -e EUREKA="-Deureka.client.service-url.defaultZone=http://scw-register1:8761/eureka,http://scw-register2:8762/eureka" -p 10000:10000 danny/scw-web:0.0.1
第二种方法: 也可以在idea使用docker插件来创建镜像
idea安装docker插件
idea打开docker插件(View->Tool Windows->Docker)
配置docker插件(setting->Build…->Docker->+)
使用docker插件(下方视图工具点击docker启动)
使用docker插件创建容器
image下选择镜像右键创建容器
输入相关参数
Name
Server(选择连接的服务器)
ImageID(镜像名称)
Container name(容器名称)
Bind ports(端口映射)
8761:8761
Environment variables(环境参数)
PORT
-Dserver.port=8761
EUREKA
-Deureka.client.service-url.defaultZone=http://scw-register2:8762/eureka
Run options(启动参数)
-di --network=mynet
配置端口映射
配置环境变量
运行创建容器
查看docker容器输出日志
docker logs -f -t --tail 10 scw-register
测试运行