什么是docker
Docker 是一种开源的平台,帮助你轻松创建、部署和管理应用程序。它利用“容器”技术,使得应用程序能够在任何环境中运行,无论是开发者的个人电脑,还是生产环境中的服务器。
通俗解释:
假设你有一个应用程序,它需要特定的操作系统、特定的配置和一系列的依赖库。通常情况下,要在不同的电脑或服务器上运行这个应用程序,可能会遇到各种各样的兼容性问题,比如某个库的版本不对,操作系统设置不一样等等。Docker 通过将应用程序及其所有依赖打包到一个“容器”中,解决了这些问题。这个容器包含了应用程序运行所需的一切,就像一个迷你操作系统。这意味着无论在开发者的电脑上,还是在生产服务器上,只要有 Docker 环境,这个容器都能运行,而且表现一致。
Docker运行原理图
docker save -o xxx.tar 镜像名称 -- 保存镜像
docker load -i xxx.tar --加载镜像
1.安装
1.1 .虚拟机中安装docker
官网:https://docs.docker.com/engine/install/centos/
--1).安装 yum-utils 工具包。yum-utils 包含了一些用于管理 yum 仓库和软件包的实用工具
sudo yum install -y yum-utils
-- 2).通过 yum-config-manager 工具添加 Docker 的 yum 仓库地址,以便能够从该仓库安装 Docker 相关的软件包。
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-- 3).安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
提示: 最近国内docker的无发访问国外仓库. 解决办法是:配置国内的Docker仓库
# 删除已有的 Docker 仓库(如果有)
sudo rm -f /etc/yum.repos.d/docker-ce.repo
# 添加阿里云的 Docker 仓库
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.2 docker启动命令
systemctl start docker --启动docker
systemctl enable docker --设置开机启动docker
systemctl stop docker --停止docker
2.docker 软件安装
2.1 docker镜像网站
Docker官方提供了一个专门管理、存储镜像的网站,并对外开放了镜像上传、下载的权利。Docker官方提供了一些基础镜像,然后各大软件公司又在基础镜像基础上,制作了自家软件的镜像,全部都存放在这个网站。这个网站就成了Docker镜像交流的社区:
https://hub.docker.com/
2.2使用docker安装mysql
在镜像网站搜索mysql
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysqldock
解读:
- docker run -d :创建并运行一个容器,-d则是让容器以后台进程运行
- --name`` mysql : 给容器起个名字叫mysql,你可以叫别的
- -p 3306:3306 : 设置端口映射。容器是隔离环境,外界不可访问。但是可以将**宿主机端口映射容器内到端口**,当访问宿主机指定端口时,就是在访问容器内的端口了。容器内端口往往是由容器内的进程决定,例如MySQL进程默认端口是3306,因此容器内端口一定是3306;而宿主机端口则可以任意指定,一般与容器内保持一致。格式: -p 宿主机端口:容器内端口,示例中就是将宿主机的3306映射到容器内的3306端口
- -``e`` TZ=Asia/Shanghai : 配置容器内进程运行时的一些参数格式:-e KEY=VALUE,KEY和VALUE都由容器内进程决定案例中,TZ=Asia/Shanghai是设置时区;MYSQL_ROOT_PASSWORD=123是设置MySQL默认密码
- mysql : 设置镜像名称,Docker会根据这个名字搜索并下载镜像(如果本机有该镜像则不在去镜像网站下载)格式:REPOSITORY:TAG,例如mysql:8.0,其中REPOSITORY可以理解为镜像名,TAG是版本号在未指定TAG的情况下,默认是最新版本,也就是mysql:latest
- 连接测试:
2.3 安装nginx
docker pull nginx --从镜像网站拉取 nginx
docker run -d --name nginx -p 80:80 nginx -- 安装docker
测试访问:
3.数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机**目录**之间映射的桥梁。
以nginx为例,如果想改变nginx.conf文件. 由于nginx.conf文件在nginx容器内部,我们无法改变,但是可以通过宿主机与容器进行映射,关系如下图:
3.1 具体操作如下
# 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
4.网络
自定义网络
# 1.首先通过命令创建一个网络
docker network create mynetwork
# 2.然后查看网络
docker network ls
# 结果:
NETWORK ID NAME DRIVER SCOPE
639bc44d0a87 bridge bridge local
403f16ec62a2 mynetwork bridge local
0dc0f72a0fbb host host local
cd8d3e8df47b none null local
# 其中,除了mynetwork以外,其它都是默认的网络
# 3.让test和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名
# 这样该网络内的其它容器可以用别名互相访问!
# 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名
docker network connect mynetwork mysql --alias db
# 3.2.db容器,也就是我们的java项目
docker network connect mynetwork test
# 4.进入test容器,尝试利用别名访问mysql
# 4.1.进入容器
docker exec -it test bash
# 4.2.用mysql别名访问
ping mysql
# 结果
PING mysql (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.mynetwork (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from mysql.mynetwork (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms
# 4.3.用容器名访问
ping db
# 结果:
PING db (172.18.0.2) 56(84) bytes of data.
64 bytes from mysql.mynetwork (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from mysql.mynetwork (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
5.自定义镜像
5.1 准备jar
5.2 准备dockerfile
dockerfile是以上jar需要的环境信息
# 基础镜像
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 test.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
5.3 上传到服务器
5.4 构建镜像
进入以上目录,执行命令
docker build -t test:1.0 .
注意,后面有个点 .
5.5 启动镜像
docker run -d --name test -p 9999:9999 test:1.0
5.6 访问
6.Compose
Docker Compose就可以帮助我们实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
案例,比如要同时部署 mysql nginx redis 和具体的项目.我们只需要配置docker-compose.yml
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- mynet
month8:
build:
context: .
dockerfile: Dockerfile
container_name: month8
ports:
- "8030:8030"
networks:
- mynet
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- month8
networks:
- mynet
- redis
redis:
image: redis
ports:
- "6379:6379"
volumes:
- ./config:/opt/config
- ./data:/data
command: redis-server /opt/config/redis.conf
networks:
- mynet
networks:
mynet:
name: month8