一、安装docker
二、拉取镜像并且跑起来
可参照mysql - Official Image | Docker Hub
1、拉取MySQL镜像: docker run --name lht-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
[root@base ~]# docker run --name lht-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
--name: 为容器指定一个名称;
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-e 设置环境变量;
MYSQL_ROOT_PASSWORD即root账户的密码。
-d: 后台运行容器,并返回容器ID;
mysql:tag 镜像版本,根据MySQL所需版本修改
查看是否运行成功:docker ps -a
[root@base ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d7a8f3a4b1ae mysql:5.7 "docker-entrypoint.s…" 6 minutes ago Up 6 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp lht-mysql
2、安装其他可参考
2.1 拉取镜像
docker pull 镜像名称[:tag]
# 举例 :docker pull daocloud.io/library/tomcat:8.5.15-jre8
2.2 查看本地全部镜像
#查看本地已经安装过的镜像信息,包含标识,名称,版本,更新时间,大小
docker images
2.3 删除本地镜像
#镜像会占用磁盘空间,可以手动删除,表示通过查看获取
docker rmi 镜像的标识
2.4 镜像的导入导出
# 如果因为网络原因可以通过硬盘的方式传输镜像,虽然不规范,但是有效,但是这种方式导出的镜像名和版本都是null,需要手动修改
# 讲本地镜像导出
docker save -o 导出的路径 镜像id
# 加载本地的镜像文件
docker load -i 镜像文件
# 修改镜像的名称
docker tag 镜像id 新镜像名称:版本
2.5 搜索镜像
docker search ******
3、容器相关指令
3.1 运行容器需要指定具体镜像,如果镜像不存在,会直接下载
docker run 镜像的标识|镜像名称[:tag]
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
# -d: 后台运行容器,并返回容器ID;
# -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
# --name="nginx-lb": 为容器指定一个名称;
# -e username="ritchie": 设置环境变量;
3.2 查看正则运行的容器
docker ps [-qa]
# -a :查看全部的容器,包括没有运行的
# -q:之查看容器标识
3.3 查看容器日志
# 查看容器日志,以查看容器运行的信息
docker logs -f 容器id
# -f:可以滚动查看日志的最后几行
3.4 进入容器内部
# 可以进入容器内部进行操作
docker exec -it 容器id bash
3.5 复制内容到容器
# 将宿主机的文件复制到容器内部的指定目录
docker cp 文件名称 容器id:容器内部路径
3.6 重启&启动&停止&删除容器
# 重新启动容器
docker restart 容器id
# 启动停止运行的容器id
docker start 容器id
# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
三、数据卷
1、什么是数据卷
数据卷:将宿主机的一个目录映射到容器的一个目录中。
可以在宿主机中操作目录中的内容,那么容器内部映射的文件,也会跟着起改变。
2、创建数据卷
创建数据卷之后,默认会存放再一个目录下/var/lib/docker/volumes/数据卷名称/_data
docker volume create 数据卷名称
3、查看数据卷详情
查看数据卷详情信息,可以查询到存放路径,创建时间等等。
docker volume inspect 数据卷名称
4、查看全部数据卷
docker volume ls
5、删除数据卷
docker volume rm 数据卷名称
6、容器映射数据卷
映射有两种方式:
6.1通过数据卷名称映射,如果数据卷不存在。Docker会帮你自动创建,会将容器内部自带的文件,存储在默认的存放路径中。使用方式:docker run -v 数据卷名称:容器内部的路径 镜像id
6.2通过路径映射数据卷,直接指定一个路径作为数据卷的存放位置。但是这个路径下是空的。使用方式:docker run -v 路径:容器内部的路径 镜像id
7使用数据卷和不适用数据卷的区别
例如MySQL:
不带数据卷:
创建mysql 镜像不带数据卷后删除再创建容器 刷新数据库后发现数据已经没有了
重新创建容器 带数据卷:
创建新的数据卷,创建容器带数据卷,做删除容器再回复的实验(这一次刷新之后发现还在)
[root@base ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
02d8ee5b48d9 mysql:5.7 "docker-entrypoint.s…" 20 seconds ago Up 19 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
[root@base ~]# docker rm -f 02
02
[root@base ~]# docker volume create mysqldata
mysqldata
[root@base ~]# cd /var/lib/docker/volumes
[root@base volumes]# ls
02cefc2d2d72c82add15f798d7929405854c5c65359d5682b4c45838b180d45c backingFsBlockDev mysqldata
750246a20f6ab042c9a71ccd3bedddbffa0c3348537a7857a035dc2a13e0c6d4 ef96b79bf04e5e35e4a02001e3f9265495d81d94637cb080f6fd9625ddf6334a
7d3cbb86159bff710d2063a82a756a701c01775ee885fabb68358d246460ebb3 metadata.db
[root@base volumes]# cd mysqldata/
[root@base mysqldata]# ls
_data
[root@base mysqldata]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
24a2456a2048171737ad3f0a2d5cc4e23397c7f2df63142f778ddbeba954494c
[root@base mysqldata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24a2456a2048 mysql:5.7 "docker-entrypoint.s…" 8 seconds ago Up 7 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
[root@base mysqldata]# docker rm -f 24
24
[root@base mysqldata]# docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -v mysqldata:/var/lib/mysql -d mysql:5.7
66d2797cdf066d36e16197a4a0c9ceaa190dbf657352b481133dbc8d74dd2cee
#这里进入容器内部查看/var/lib/mysql
[root@base lib]# docker exec -it 66 bash
root@66d2797cdf06:/# ls
bin boot dev docker-entrypoint-initdb.d entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@66d2797cdf06:/# cd /var/lib/mysql
root@66d2797cdf06:/var/lib/mysql# ls
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem test_volume
root@66d2797cdf06:/var/lib/mysql#
四、Docker Dockerfile
4.1 什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
我们可以从中央仓库下载一个镜像,也可以自己手动去制作—个镜像,需要通过Dockerfile去指定自定义镜像的信息
4.2 Dockerfile的基本语法
创建自定义镜像就需要创建一个Dockerfile,如下为Dockerfile的语言
from:指定当前自定义镜像依赖的坏境
copy:将相对路径下的内容复制到自定义镜像中workdir :声明镜像的默认工作目录
run:执行的命令,可以编写多个
cmd:需要执行的命令(在workdir下执行的,cmd可以写多个,只以最后一个为准)
#举个例子,制作SSM容器镜像,而且ssm.war要放在Dockerfile的同级目录下
from daocloud.io/library/tomcat: 8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
copy 与add
add 能完成copy的所有事情,除此以外add还能解压,能从url_拷贝文件到镜像
ADD http://example.com/ big.tar.xz /usr/src/things/
run cmd ENTRYPOINT
RUN命令执行命令并创建新的镜像层,通常用于安装软件包
CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换
ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行docker run时指定了其他命令)
env 环境变量设置
expose 容器暴露端口
4.3 通过Dockerfile创建镜像
编写完Dockerfile后需要通过命令将其制作为镜像,并且要在Dockerfile的当前目录下,之后即可在镜像中查看到指定的镜像信息,注意最后的 .
docker build -t 镜像名称[:tag] .
4.4 举例
4.4.1创建Dockerfile
FROM openjdk:8-jre--我要创建的镜像 继承jdk8的镜像
ENV HOME /home
run mkdir HOME--在镜像中执行命令
COPY ./my. jar HOME/my. jar--把宿主机中的文件copy 到容器中
WORKDIR HOME--workdir定义容器的工作目录
EXPOSE 8090
ENTRYPOINT [" java", " -jar", "my.jar"]--容器一启动马上执行的命令
4.4.2创建镜像
docker build -t myhub:1.0 .
# docker build 要在和dockerfile 同一路径下执行
4.4.3 根据镜像创建容器
docker run -p 8080:8090 -d myhub:1.0
** 创建dockerfile 有参数的** 运行容器的时候 指定环境参数
FROM openjdk:8-jre
ENV HOME /home
ENV profile dev
run mkdir HOME
COPY ./my.jar HOME/my.jar
WORKDIR HOME
ENTRYPOINT java -jar my.jar --spring.profiles.active=$profile
4.4.4创建镜像
docker build -t myhub1:1.0 .
4.4.5运行的时候传参数
docker run -p 8081:8091 -e profile=prod -d myhub1:1.0
五、测试
1、准备一个项目,mvn package打包如有第三方jar包可参考以下网址打包
mvn clean
mvn install
mvn package--jar包文件打包在target目录中
java -jar target/项目名.jar--能在本地运行成功
将项目上传至git仓库(上传仓库可参考)
2、linux配置ssh
链接生成/添加SSH公钥 - Gitee.com,如下
[root@base gitee]# ssh-keygen -t ed25519 -C "****@****.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ed25519.
Your public key has been saved in /root/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:JJG4LKXW/NdFiq9uNAMSjSdbvyDLukVPJlkFtW8zLOE jsxllht@163com
The key's randomart image is:
+--[ED25519 256]--+
| +o+o |
| * =o . . |
| * Bo.+. o |
| + Ooo+o+. . |
| . o+=ooE+*. |
| .o=. *ooo |
| .. .o + |
| .. o |
| .. o. |
+----[SHA256]-----+
[root@base gitee]# cat ~/.ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1*************************************mwmykeFwAWFiMks jsxllht@163com
[root@base gitee]# ssh -T git@gitee.com
The authenticity of host 'gitee.com (212.64.62.183)' can't be established.
ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc.
ECDSA key fingerprint is MD5:27:e5:d3:f7:2a:9e:eb:6c:93:cd:1f:c1:47:a3:54:b1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitee.com,212.64.62.183' (ECDSA) to the list of known hosts.
Hi liar! You've successfully authenticated, but GITEE.COM does not provide shell access.
3、安装git,通过ssh拉取项目
# 安装git
yum install git
# 通过ssh拉取项目
git clone git@gitee.com:lht1999/dockerfile_demo.git
4、Linux 下载安装maven
官网:Maven – Welcome to Apache Maven
4.1选择tar.gz 文件,复制链接地址;
https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
# 更改https 为 http 否则会出现如下错误
# 错误: 无法验证 dlcdn.apache.org 的由 “/C=US/O=Let's Encrypt/CN=R3” 颁发的证书:
#Linxu中wget下载:wget http://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
4.2#解压,maven不用安装,解压后即可。
[root@base gitee]# tar -zxvf apache-maven-3.8.4-bin.tar.gz
-z或--gzip或--ungzip 通过gzip指令处理备份文件。
-x或--extract或--get 从备份文件中还原文件。
-v或--verbose 显示指令执行过程。
-f<备份文件>或--file=<备份文件> 指定备份文件。
4.3删除压缩包:rm -f apache-maven-3.8.4-bin.tar.gz
4.4配置环境变量,编辑/etc/profile, 配置MVN_HOME环境变量
移动解压文件到/use/local目录下(软件一般安装到这个目录):mv apache-maven-3.8.4 /usr/local/apache-maven-3.8.4
编辑/etc/profile:vim /etc/profile
[root@base gitee]# vim /etc/profile
#添加export
export MVN_HOME=/usr/local/apache-maven-3.8.4
export PATH=$MVN_HOME/bin:$PATH
4.5刷新配置立即生效:source /etc/profile
[root@base local]# source /etc/profile
验证是否成功:mvn -version
如没配置javahome会报错如下(其实就是JDK)
[root@base local]# mvn -version
显示maven版本即为成功
5进入克隆git的文件夹将文件打成jar包
[root@base gitee]#cd dockerfile_demo/
[root@base dockerfile_demo]# mvn clean package -Dmaven.test.skip=true
把新iar包copy到和 dockerfile同级目录下准备创建新的镜像
[root@base dockerfile_demo]# ls
mvnw mvnw.cmd pom.xml src target
[root@base dockerfile_demo]# cd target
[root@base target]# ls
classes dockerfile_demo-0.0.1-SNAPSHOT.jar.original generated-test-sources maven-status test-classes
dockerfile_demo-0.0.1-SNAPSHOT.jar generated-sources maven-archiver surefire-reports
# 创建多级目录
[root@base target]# mkdir -p /usr/docker/dockerfile
# 复制文件到刚创建的目录中
[root@base target]# cp dockerfile_demo-0.0.1-SNAPSHOT.jar /usr/docker/dockerfile/dockerfile_demo-0.0.1-SNAPSHOT.jar
# 进入创建的文件
[root@base target]# cd /usr/docker/dockerfile/
# 新建文件夹并编辑,这里名字只能是Dockerfile
[root@base dockerfile]# vim Dockerfile
# 查看内容是否有误
[root@base dockerfile]# cat Dockerfile
FROM openjdk:8-jre
ENV HOME /home
run mkdir HOME
COPY ./dockerfile_demo-0.0.1-SNAPSHOT.jar HOME/my.jar
WORKDIR HOME
ENTRYPOINT ["java", "-jar", "my.jar"]
# 查看文件
[root@base dockerfile]# ls
Dockerfile dockerfile_demo-0.0.1-SNAPSHOT.jar
# 创建新的镜像(后面有一点不要忘记)
[root@base dockerfile]# docker build -t dockerfile:1.0 .
Sending build context to Docker daemon 17.56MB
Step 1/6 : FROM openjdk:8-jre
8-jre: Pulling from library/openjdk
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
99ce012bef04: Pull complete
22dc2a72d098: Pull complete
9c69a57e10d9: Pull complete
Digest: sha256:c0ab1c0631266ef9420a414726a790733a2561efc5f4fa2f9b8186f4d6b00d53
Status: Downloaded newer image for openjdk:8-jre
---> 26ac3f63d29f
Step 2/6 : ENV HOME /home
---> Running in 88905b7c0c42
Removing intermediate container 88905b7c0c42
---> 967549eff1c4
Step 3/6 : run mkdir HOME
---> Running in 973543394c9d
Removing intermediate container 973543394c9d
---> 64beb2d7d7d5
Step 4/6 : COPY ./dockerfile_demo-0.0.1-SNAPSHOT.jar HOME/my.jar
---> 3eabf74d499e
Step 5/6 : WORKDIR HOME
---> Running in bcd0b5def4ce
Removing intermediate container bcd0b5def4ce
---> b012a9d79c46
Step 6/6 : ENTRYPOINT ["java", "-jar", "my.jar"]
---> Running in 623b1cc99df0
Removing intermediate container 623b1cc99df0
---> 7453ab2c8f27
Successfully built 7453ab2c8f27
Successfully tagged dockerfile:1.0
[root@base dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockerfile 1.0 7453ab2c8f27 4 minutes ago 291MB
openjdk 8-jre 26ac3f63d29f 31 hours ago 273MB
mysql 5.7 c20987f18b13 2 days ago 448MB
mysql latest 3218b38490ce 2 days ago 516MB
# 运行docker 如果有指定环境可以通过-e 来设置 如(-e profile=test)
[root@base dockerfile]# docker run -d -p 7777:7777 --name dockerfile-test dockerfile:1.0
35074a683876f18c7d77949c35908f4722b7cfe17ae061a9cebb2132a58da38f
# 查看docker
[root@base dockerfile]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
35074a683876 dockerfile:1.0 "java -jar my.jar" 25 seconds ago Up 23 seconds 0.0.0.0:7777->7777/tcp, :::7777->7777/tcp dockerfile-test
66d2797cdf06 mysql:5.7 "docker-entrypoint.s…" 20 hours ago Up 20 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp some-mysql
# 查看docker容器日志(如果项目需要连接数据库记得先打开数据库连接)
[root@base dockerfile]# docker logs -f 3507
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.2)
2021-12-23 06:06:09.485 INFO 1 --- [ main] c.e.d.DockerfileDemoApplication : Starting DockerfileDemoApplication v0.0.1-SNAPSHOT using Java 1.8.0_312 on 35074a683876 with PID 1 (/HOME/my.jar started by root in /HOME)
2021-12-23 06:06:09.488 INFO 1 --- [ main] c.e.d.DockerfileDemoApplication : No active profile set, falling back to default profiles: default
2021-12-23 06:06:10.740 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 7777 (http)
2021-12-23 06:06:10.753 INFO 1 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-12-23 06:06:10.753 INFO 1 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.56]
2021-12-23 06:06:10.846 INFO 1 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-12-23 06:06:10.847 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1267 ms
2021-12-23 06:06:11.250 INFO 1 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 7777 (http) with context path ''
2021-12-23 06:06:11.260 INFO 1 --- [ main] c.e.d.DockerfileDemoApplication : Started DockerfileDemoApplication in 2.191 seconds (JVM running for 2.598)
2021-12-23 06:07:21.855 INFO 1 --- [nio-7777-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-12-23 06:07:21.855 INFO 1 --- [nio-7777-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-12-23 06:07:21.856 INFO 1 --- [nio-7777-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms
可以通过映射不同端口创建多个容器再通过nginx实现负载均衡
六、maven docker 插件(原理,具体操作在CICD中)
把工程 自动达成镜像
执行mvn clean package -Dmaven.test.skip=true
把jar copy 到dockerfile 同一文件夹下面
自己写dockerfile
创建镜像
1、自动的把镜像上传到私服
创建Dockerfile 放在 Resouces 下
Dockerfile举例
FROM openjdk:8-jre
ENV ARTIFACTID dbtest
ENV ARTIFACTVERSION 1.0-SNAPSHOT
ENV HOME_PATH /home
WORKDIR $HOME_PATH
ADD /$ARTIFACTID-$ARTIFACTVERSION.jar $HOME_PATH/$ARTIFACTID.jar
ENTRYPOINT ["java", "-jar", "dbtest.jar"]
2、加入 docker 插件(新写一个docker.xml原先依赖需要同步在加上 docker 插件)
<!--docker 插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<!--docker镜像相关的配置信息1-->
<configuration>
<!--镜像名,这里用工程名-->
<imageName>${project.artifactId}</imageName>
<!--Dockerfile文件所在目录-->
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!--TAG,这里用工程版本号-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--构建镜像的配置信息-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.artifactId}-${project.version}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
3、上传代码到git
git add .--本地
git commit -m""
git push orgin master--推送到远程仓库
4、开发服务器 拉取最新代码
git pull origin master
5、打包并且打成镜像
mvn clean package -Dmaven.test.skip=true -f pom_docker.xml docker:build
6、通过镜像运行容器
docker run -d -p 8090:8090 --name dbtest01 dbtest:1.0-SNAPSHOT
7、 测试