Docker快速入门到项目部署

一、课程介绍

实现一键部署,

Docker是 快速构建、运行、管理应用的工具。

9839014b67a248f98cfe73e95b54f85e.png

5824033da96a4751ae79419fdc845efa.png

f4227c330cb541fcac469b8d2625ed4f.png

 

二、docker的安装

安装教程地址

三、快速入门-部署MySQL

docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql

a6bdb95bc103443491035e2f4881a806.png

一键安装成功,此时就可以连接到mysql了

c8b682967b3e46709045fdf0664fd936.png

镜像和容器

创建的容器是一个隔离环境,有自己独立的内存空间、文件系统、网络空间、ip地址、这个网络空间对外是不可访问的。 

不过连接容器所在的服务器是可以连接成功的。

2b70b399fc524079bc83acc10f0c35a9.png

四、快速入门-命令解读 

docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \mysql

创建并运行容器 docker run

docker run

docker,所有的docker命令都是以docker为起始。

run 就是子命令。docker下面有很多子命令,run是其中一个。创建并运行一个容器。

让容器后台运行 -d

-d 

-d 是让容器在后台运行

给容器取名--name

--name mysql

给容器取名为mysql ,必须唯一

设置端口映射-p

-p 3306:3306

前面是宿主机端口:不一定是3306,假如部署两台mysql,这个宿主机端口就可以是3307

后面是容器内部端口:取决于进程,不需要改动。

设置端口映射。 由于对外是不可访问的,而对容器所在的服务器是可以访问的。因此做一个端口的映射,把宿主机的3306端口和容器的3306端口做一个映射。

当我们访问外部3306端口,docker就会把这个请求转换都容器内部的3306端口了。这样就间接访问到容器了。

宿主机只有一个3306端口,会冲突,

而创建的容器是相互独立的,因此可以有多个3306端口

 设置环境变量-e

-e KEY=VALUE

环境变量由镜像的制作者决定 。

Docker环境变量查找文档(外网)

 这里可以查环境变量

mysql这里我们配置了两个环境变量

-e TZ=Asia/Shanghai

时区

 -e MYSQL_ROOT_PASSWORD=123 

密码

 指定运行镜像的名字mysql:版本

mysql

 镜像命名规范

c50c735160a4488db78e3ac98012f540.png

总结:

 03078bc9eade4bd98dcd0decdb2c297f.png

五、docker常见命令 

官方文档

dece9a6ab2ea412e934c6c1091bfd6f6.png

 案例:查看DockerHub,拉去Nginx镜像,创建并运行Nginx容器

25d3f6ead1ea414d97c9e8be6c2a47ff.png

第一步:去DockerHub查看nginx镜像仓库及相关信息

 第二步:拉取镜像

docker pull nginx

 第三步:查看镜像列表

docker images

11261bcbe5334408b1a6787f9ed76cee.png

保存镜像到本地

docker save -o 文件名 镜像名:版本

46b3d8e0dde04d4a9c0aeb863667a6ad.png

 删除镜像

docker rmi 镜像名:版本

2f44593108924b4f879f69aa4d1647be.png

加载镜像

c1781cd30d4147ab9119f95fe28846bf.png

加载完毕,nginx又回来了。 

8bdaeac3d0944075b1b422032d68c3af.png

镜像操作:上面 

容器操作:下面 

第四步:创建并允许Nginx容器

docker run -d --name nginx -p 80:80 nginx

第五步:查看运行中容器

docker ps

5dbaacda61f04a1c9ba99480f5cc8737.png

也可以加

格式化方式访问

,格式会更加清爽

docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 

第六步:访问网页,地址:http://虚拟机地址

端口是80 不用写

a42d967920bd4b84be782644d20aacef.png

第七步:停止容器

docker stop nginx

第八步:查看所有容器

docker ps -a

第九步:再次启动nginx容器

docker start nginx

第十步:再次查看容器

docker ps

第十一步:查看容器详细信息

docker inspect nginx

第十二步:进入容器,查看容器内目录

进入nginx目录

docker exec -it nginx bash

e984f3d779b740beabfab44ffb06264f.png

exec是执行 

-it 就是添加一个可输入的终端 

bash 命令进行交互

或者,可以进入MySQL

docker exec -it mysql mysql -uroot -p

访问mysql

 be67c34262eb412fb14fce269e057268.png

也可以直接在容器外部连接 

docker exec -it mysql mysql -uroot -p 

c91a2093b22d454ab9f80e5024102814.png

退出

 exit

第十三步:删除容器

docker rm nginx

发现无法删除,因为容器运行中,强制删除容器

docker rm -f nginx

查看日志 

 docker logs 容器名

实时查看日志 

  docker logs -f 容器名

 六、命令别名

给常用Docker命令起别名,方便我们访问:

修改/root/.bashrc文件

vi /root/.bashrc

# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi

然后,

执行命令使别名生效 

source /root/.bashrc

source /root/.bashrc

 七、Docker基础-数据卷挂载

容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。大家思考几个问题:​
•如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?​
•MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?​
•我想要让Nginx代理我的静态资源怎么办?​

因此,容器提供程序的运行环境,但是程序运行产生的数据、程序运行依赖的配置都应该与容器解耦。

什么是数据卷

数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。​
以Nginx为例,我们知道Nginx中有两个关键的目录:​
•html:放置一些静态资源​
•conf:放置配置文件​
如果我们要让Nginx代理我们的静态资源,最好是放到html目录;

如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。​
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:

9fd409d65bb64348bcf779c9cc56597f.png

在上图中:​
•创建了两个数据卷:conf、html​
•Nginx容器内部的conf目录和html目录分别与两个数据卷关联。​
•而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录


这样以来,

容器内的conf和html目录就 与宿主机的conf和html目录关联起来,我们称为挂载。

此时,我们操作宿主机的/var/lib/docker/volumes/html/_data

就是在操作容器内的/usr/share/nginx/html/_data目录。

只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。 

操作数据卷的命令

4867574b59b3439099597b60194e9be1.png e95c6e07b4194a128d90b2ec181c95ca.png

 

案例:利用Nginx容器部署静态资源 

06b0ad9f35e34b78b340ffb6d403a33a.png

fbcfdb4b89a147219da490d54cd4c425.png

# 1.首先创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx# 2.然后查看数据卷
docker volume ls
# 结果
DRIVER    VOLUME NAME
local     29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459f
local     html# 3.查看数据卷详情
docker volume inspect html
# 结果
[{"CreatedAt": "2024-05-17T19:57:08+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/html/_data","Name": "html","Options": null,"Scope": "local"}
]# 4.查看/var/lib/docker/volumes/html/_data目录
ll /var/lib/docker/volumes/html/_data
# 可以看到与nginx的html目录内容一样,结果如下:
总用量 8
-rw-r--r--. 1 root root 497 12月 28 2021 50x.html
-rw-r--r--. 1 root root 615 12月 28 2021 index.html# 5.进入该目录,并随意修改index.html内容
cd /var/lib/docker/volumes/html/_data
vi index.html# 6.打开页面,查看效果# 7.进入容器内部,查看/usr/share/nginx/html目录内的文件是否变化
docker exec -it nginx bash

小结:

 8049fb5bba1244c8b91f31a8fb8f37c9.png

八、本地目录挂载

可以发现,数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。

在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:

# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件

 注意:本地目录或文件必须以 /./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。

-v mysql:/var/lib/mysql # 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql # 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录

案例2 mysql容器的数据挂载 

c73d4de69b274e2ab843c8b26e2c2d13.png

教学演示,删除并重新创建mysql容器,并完成本地目录挂载:​
•挂载/root/mysql/data到容器内的/var/lib/mysql目录​
•挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录(初始化的SQL脚本目录)​
•挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录(这个是MySQL配置文件目录) 

 创建本地目录

mkdir mysql

cd mysql

mkdir data

mkdir conf

mkdir init

# 1.删除原来的MySQL容器
docker rm -f mysql# 2.进入root目录
cd ~# 3.创建并运行新mysql容器,挂载本地目录
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \-v ./mysql/data:/var/lib/mysql \-v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d \mysql# 4.查看root目录,可以发现~/mysql/data目录已经自动创建好了
ls -l mysql
# 结果:
总用量 4
drwxr-xr-x. 2 root    root   20 5月  19 15:11 conf
drwxr-xr-x. 7 polkitd root 4096 5月  19 15:11 data
drwxr-xr-x. 2 root    root   23 5月  19 15:11 init# 查看data目录,会发现里面有大量数据库数据,说明数据库完成了初始化
ls -l data# 5.查看MySQL容器内数据
# 5.1.进入MySQL
docker exec -it mysql mysql -uroot -p123
# 5.2.查看编码表
show variables like "%char%";
# 5.3.结果,发现编码是utf8mb4没有问题
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+# 6.查看数据
# 6.1.查看数据库
show databases;
# 结果,hmall是黑马商城数据库
+--------------------+
| Database           |
+--------------------+
| hmall              |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
# 6.2.切换到hmall数据库
use hmall;
# 6.3.查看表
show tables;
# 结果:
+-----------------+
| Tables_in_hmall |
+-----------------+
| address         |
| cart            |
| item            |
| order           |
| order_detail    |
| order_logistics |
| pay_order       |
| user            |
+-----------------+
# 6.4.查看address表数据
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
| id | user_id | province | city   | town     | mobile      | street        | contact   | is_default | notes |
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
| 59 |       1 | 北京     | 北京   | 朝阳区    | 13900112222 | 金燕龙办公楼   | 李佳诚    | 0          | NULL  |
| 60 |       1 | 北京     | 北京   | 朝阳区    | 13700221122 | 修正大厦       | 李佳红    | 0          | NULL  |
| 61 |       1 | 上海     | 上海   | 浦东新区  | 13301212233 | 航头镇航头路   | 李佳星    | 1          | NULL  |
| 63 |       1 | 广东     | 佛山   | 永春      | 13301212233 | 永春武馆       | 李晓龙    | 0          | NULL  |
+----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+
4 rows in set (0.00 sec)

小结:

2ca1ff79d0514e8f89050dfac7628f9c.png

 九、Docker语法

6ae8846ee8af4959be803649a5445374.png

10d3fa55749f4b76886f02f567182419.png

分层可以 共享前面几层。

 Dockerfile指令

a61b6c69f025444291754f78185bbc2d.png

例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下: 

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

同学们思考一下:以后我们会有很多很多java项目需要打包为镜像,他们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是不是很麻烦。

 

所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

a65e88b9e7e647999d6df5432bc353d7.png

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

十、自定义镜像(给java应用构建镜像并部署)

1337c9d28d9449a8a35339b090e3fcbc.png

构建镜像 

当Dockerfile文件写好以后,就可以利用命令来构建镜像了。

在课前资料中,我们准备好了一个demo项目及对应的Dockerfile:

首先,我们将课前资料提供的docker-demo.jar包以及Dockerfile拷贝到虚拟机的/root/demo目录:

记得先将

jdk.tar这个镜像传入并进行加载。

8f04e93d9f114d0885b7328ec980c0d2.png

然后,执行命令,构建镜像:

docker build -t docker-demo .

d57bd423d4b34ae1a965da8d6dd675a0.png

dis 查看镜像 

727e154fa2164fdfb9f779b68d2bdec9.png

然后尝试运行该镜像:

# 1.创建并运行容器
docker run -d --name dd -p 8080:8080 docker-demo:1.0
# 2.查看容器
dps
# 结果
CONTAINER ID   IMAGE             PORTS                                                  STATUS         NAMES
78a000447b49   docker-demo:1.0   0.0.0.0:8080->8080/tcp, :::8090->8090/tcp              Up 2 seconds   dd
f63cfead8502   mysql             0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   Up 2 hours     mysql# 3.访问
curl localhost:8080/hello/count
# 结果:
<h5>欢迎访问黑马商城, 这是您第1次访问<h5>

342e99a5c7084ccc8c8e585c7397a13b.png

总结:

be50fc5d4bee457fadbb29efdf77e2c2.png 十一、容器网络互连

21df617380a646b1aff75450f68cdbf8.png

Java项目往往需要访问其它各种中间件,例如MySQL、Redis等。现在,我们的容器之间能否互相访问呢?我们来测试一下

首先,我们查看下MySQL容器的详细信息,重点关注其中的网络IP地址:

# 1.用基本命令,寻找Networks.bridge.IPAddress属性
docker inspect mysql
# 也可以使用format过滤结果
docker inspect --format='{{range .NetworkSettings.Networks}}{{println .IPAddress}}{{end}}' mysql
# 得到IP地址如下:
172.17.0.2# 2.然后通过命令进入dd容器
docker exec -it dd bash# 3.在容器内,通过ping命令测试网络
ping 172.17.0.2
# 结果
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.058 ms

发现可以互联,没有问题。

但是像mysql这样的ip地址是docker网桥给分配的,假如服务重新启动,或者把它停掉。过程中有其他容器也启动了。那么你的ip地址可能被其他容器占用。ip地址会发生变化。所以将来在java代码要配置mysql地址,万一变了就连接不上了。

所以,我们必须借助于docker的网络功能来解决这个问题,官方文档: 

常见网络命令

751053a283094b888888bfaa579a0c3c.png

 教学演示:自定义网络

创建自定义网络,会创建一个新的网桥,它的网段就和默认创建的不一样了。

那么加入了这个网桥的容器就可以互连了。并且还能通过容器名相互访问。

# 1.首先通过命令创建一个网络
docker network create hmall# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID     NAME      DRIVER    SCOPE
639bc44d0a87   bridge    bridge    local
403f16ec62a2   hmall     bridge    local
0dc0f72a0fbb   host      host      local
cd8d3e8df47b   none      null      local
# 其中,除了hmall以外,其它都是默认的网络# 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect hmall mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect hmall dd# 4.进入dd容器,尝试利用别名访问db
# 4.1.进入容器
docker exec -it dd bash
# 4.2.用db别名访问
ping db
# 结果
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping mysql
# 结果:
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms

OK,现在无需记住IP地址也可以实现容器互联了。

docker network create hmall

docker network ls

9ddeb738119d4823b52318c4fcda20bd.png

docker network connect hmall mysql --alias db

//.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名

docker network connect hmall dd

docker exec -it dd bash  //进入容器

ping mysql 

e76ab53aeb7e424986d759c471b99f07.png

创建容器的时候直接添加网络 

28794b5cbec4450b9f9d0625d7178b50.png

总结

  • 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身

  • 在同一个自定义网络中的容器,可以通过别名互相访问

 

十二、项目部署---部署java应用

第一步:项目打jar包 和准备 Dockerfile文件上传到虚拟机root目录下

第二步:构建项目镜像,不指定tag,则默认为latest 

docker build -t hmall .

9d2942e0620f4705bbb7180ac41a2de0.png

查看镜像

dis

多了个hmall的镜像 

c365fe2d0b354838ad5bffb87d5305ed.png

第三步:创建网络 heima

docker network create heima

第四步:让mysql这个容器连接上黑马网络

docker network connect heima mysql 

第五步:创建并运行 hmall  这个容器。

指定后台运行,名字为hmall。端口号 8080 

网络为heima。最后跟上镜像名字 hmall。

docker run -d --name hmall -p 8080:8080 --network heima hmall

第六步:查看hamll容器的日志 

docker logs -f hmall

部署成功,可以正常访问后端接口。0e4027ca6fd84ac6a5781819dc9c3978.png

十三、项目部署---部署前端

7df5a5d9290f45c4b49523797195256c.png

hmall-portalhmall-admin是前端代码,需要基于nginx部署。

其中:​
•html是静态资源目录,我们需要把hmall-portal以及hmall-admin都复制进去​
•nginx.conf是nginx的配置文件,主要是完成对html下的两个静态资源目录做代理

我们现在要做的就是把整个nginx目录上传到虚拟机的/root目录下:

然后创建nginx容器并完成两个挂载:​

挂载conf文件 
•把/root/nginx/nginx.conf挂载到/etc/nginx/nginx.conf​

挂载html目录
•把/root/nginx/html挂载到/usr/share/nginx/html 

由于需要让nginx同时代理hmall-portal和hmall-admin两套前端资源,因此我们需要暴露两个端口:​
•18080:对应hmall-portal​     用户端端口
•18081:对应hmall-admin     管理端端口

docker run -d \--name nginx \-p 18080:18080 \-p 18081:18081 \-v /root/nginx/html:/usr/share/nginx/html \-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \--network heima \nginx

 注意:要开放18080和18081端口号

允许 18080 和 18081端口的 TCP 流量通过

iptables -A INPUT -p tcp --dport 18080 -j ACCEPT

iptables -A INPUT -p tcp --dport 18081 -j ACCEPT

将 18080 和18081端口添加到公共区域。 

firewall-cmd --zone=public --add-port=18080/tcp --permanent 

 重新加载firewalld配置,使添加的端口生效

firewall-cmd --reload 

十四、项目部署---DockerCompose

baf8e73120444fc9ac0712757908f6ce.png

 DockerCompose.yml文件

对比一下docker yun命令 和   DockerCompose.yml 文件区别

fb725a776ef948b293a77daed8c74b59.png

使用 DockerCompose.yml文件全自动部署黑马商城 项目

黑马商城部署文件:

version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: hmall

docker compose的命令格式 

 

0e8603f8e8724b44b8dc417a926c7cfb.png

 一键部署:

docker compose up -d

容器一键创建并运行。

网络一键创建。

项目启动。

5425907e546447feaf5115e9b178a7cc.png

一键停止:

docker compose down

 容器网络全部移除,干干净净。d803e3397d8b44b5b9bb05f03258fe71.png

DockerCompose的功能远不止这些

还可以集群部署:多台服务器一键把这些java项目部署到不同的服务器。这时候要借助其他功能。

还可以多实力部署、负载均衡。

不过作为

开发人员:

项目开发好之后写一个Dockerfile文件就行了

运维根据Dockerfile文件做编译。镜像构建和部署。现在的企业还会有持续集成技术。

把Dockerfile写好,代码写好,不用管把代码提交推送到代码仓库。然后触发一个自动化脚本。自动完成构建,一键部署。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494562.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

差分矩阵(Difference Matrix)与累计和矩阵(Running Sum Matrix)的概念与应用:中英双语

本文是学习这本书的笔记: https://web.stanford.edu/~boyd/vmls/ 差分矩阵&#xff08;Difference Matrix&#xff09;与累计和矩阵&#xff08;Running Sum Matrix&#xff09;的概念与应用 在线性代数和信号处理等领域中&#xff0c;矩阵运算常被用来表示和计算各种数据变换…

C++ OpenGL学习笔记(4、绘制贴图纹理)

相关链接&#xff1a; C OpenGL学习笔记&#xff08;1、Hello World空窗口程序&#xff09; C OpenGL学习笔记&#xff08;2、绘制橙色三角形绘制、绿色随时间变化的三角形绘制&#xff09; C OpenGL学习笔记&#xff08;3、绘制彩色三角形、绘制彩色矩形&#xff09; 通过前面…

被裁20240927 --- 嵌入式硬件开发 前篇

前篇主要介绍一些相关的概念&#xff0c;用于常识扫盲&#xff0c;后篇开始上干货&#xff01; 他捧着一只碗吃过百家的饭 1. 处理器芯片1.1 处理器芯片制造商一、 英特尔&#xff08;Intel&#xff09;二、 三星&#xff08;SAMSUNG&#xff09;三、 高通&#xff08;Qualcomm…

华为EC6108V9/C 通刷固件包,内含高安版及详细教程

该固件的特点包括 调出被屏蔽的功能、无广告和强制升级、精简软件、去除安装限制、支持多种花式功能等。 固件压缩包内有详细刷机教程&#xff1a; 需用特定格式的 8G 品牌 U 盘&#xff0c;导入 4 个文件到根目录&#xff0c;短接特定点&#xff0c;出现升级提示后松开等待…

运维工程师面试系统监控与优化自动化与脚本云计算的理解虚拟化技术的优点和缺点

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

汽车IVI中控开发入门及进阶(47):CarPlay开发

概述: 车载信息娱乐(IVI)系统已经从仅仅播放音乐的设备发展成为现代车辆的核心部件。除了播放音乐,IVI系统还为驾驶员提供导航、通信、空调、电源配置、油耗性能、剩余行驶里程、节能建议和许多其他功能。 ​ 驾驶座逐渐变成了你家和工作场所之外的额外生活空间。2014年,…

Spring(三)-SpringWeb-概述、特点、搭建、运行流程、组件、接受请求、获取请求数据、特殊处理、拦截器

文章目录 一、SpringWeb概述 二、SpringWeb特点 三、搭建SpringWeb&#xff08;在web项目中&#xff09; 1、导包 2、在web.xml文件中配置统一拦截分发器 DispatcherServlet 3、开启 SpringWEB 注解 4、处理器搭建 四、SpringWeb运行流程 五、SpringWeb组件 1、前端控…

Vue2四、 scoped样式冲突,data是一个函数,组件通信-父传子-子传父-非父子

组件通信 1. 父组件通过 props 将数据传递给子组件 2. 子组件利用 $emit 通知父组件修改更新 父--->子 子--->父

LLaMA-Factory(二)界面解析

这里写目录标题 1. 基础选项语言模型选择模型路径微调方法检查点路径量化等级量化方法提示模板RoPE加速方式 2.模型训练界面训练方式数据集超参数设置其他参数部分参数设置LoRA参数设置RLHF参数设置GaLore参数设置BAdam参数设置训练 3.评估预测界面4.Chat界面5.导出Export界面 …

SRE 与 DevOps记录

flashcat https://flashcat.cloud

Python入门:4.Python中的运算符

引言 Python是一间强大而且便捷的编程语言&#xff0c;支持多种类型的运算符。在Python中&#xff0c;运算符被分为算术运算符、赋值运算符、复合赋值运算符、比较运算符和逻辑运算符等。本文将从基础到进阶进行分析&#xff0c;并通过一个综合案例展示其实际应用。 1. 算术运…

蓝桥杯物联网开发板硬件组成

第一节 开发板简介 物联网设计与开发竞赛实训平台由蓝桥杯大赛技术支持单位北京四梯科技有限公司设计和生产&#xff0c;该产品可用于参加蓝桥杯物联网设计与开发赛道的竞赛实训或院校相关课程的 实践教学环节。 开发板基于STM32WLE5无线微控制器设计&#xff0c;芯片提供了25…

ARM异常处理 M33

1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类&#xff1a;预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看&#xff0c;获取更信息的异常原因&#xff1a; CFSR是由UFSR、BFSR和MMFSR组成&#xff1a; 下面列举HFSR、MMFSR、…

百度热力图数据处理,可直接用于论文

数据简介1、CSV点数据2、SHP数据3、TIF数据4、png图片或标准经纬度出图5、案例6、论文的参考方向 其他数据处理/程序/指导&#xff01;&#xff01;&#xff01;&#xff08;1&#xff09;街景数据获取&#xff08;2&#xff09;街景语义分割后像素提取&#xff0c;指标计算代码…

利用Gurobi追溯模型不可行原因的四种方案及详细案例

文章目录 1. 引言2. 追溯不可行集的四种方法2.1 通过约束增减进行判断2.2 通过computeIIS函数获得冲突集2.3 利用 feasRelaxS() 或 feasRelax() 函数辅助排查2.4 利用 IIS Force 属性1. 引言 模型不可行是一个让工程师头疼的问题,对于复杂模型而言,导致模型不可行的原因可能…

数据流图和流程图的区别

在结构化建模中&#xff0c;数据流图和流程图都是非常重要的工具&#xff0c;它们为开发人员提供了强大的手段来分析和设计系统。尽管两者在表面上看起来有些相似&#xff0c;但它们在功能、用途和表达方式上存在显著的区别。本文将详细探讨数据流图和流程图的区别&#xff0c;…

《计算机组成及汇编语言原理》阅读笔记:p48-p81

《计算机组成及汇编语言原理》学习第 4 天&#xff0c;p48-p81 总结&#xff0c;总计 34 页。 一、技术总结 1.CISC vs RISC p49&#xff0c; complex instruction set computing For example, a complex instruction set computing (CISC) chip may be able to move a lar…

GitLab的安装与卸载

目录 GitLab安装 GitLab使用 使用前可选操作 修改web端口 修改Prometheus端口 使用方法 GitLab的卸载 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab安装 Gitlab的rpm包集成了它需要的软件&#xff0c;简化了安装步骤&#xff0c;所以直接…

LAUNCHXL_F28379D_Workspace_CCS124

/// 安装 controlSUITE C:\ti\controlSUITE\device_support\F2837xD\v210 /// /// /// /// /// 删除 /// /// /// >> Compilation failure source_common/subdir_rules.mk:9: recipe for target source_common/F2837xD_Adc.obj failed "C:/ti/controlSUITE/devic…

封装(2)

大家好&#xff0c;今天我们来介绍一下包的概念&#xff0c;知道包的作用可以更好的面对今后的开发&#xff0c;那么我们就来看看包是什么东西吧。 6.3封装扩展之包 6.3.1包的概念 在面向对象体系中,提出了一个软件包的概念,即:为了更好的管理类,把多个类收集在一起成为一组…