docker原理流程

image-20240123202010953

docker安装

卸载旧版

首先如果系统中已经存在旧的Docker,则先卸载:

1
2
3
4
5
6
7
8
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

配置Docker的yum库

首先要安装一个yum工具

1
yum install -y yum-utils

安装成功后,执行命令,配置Docker的yum源:

1
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

这里安装过程如果报错Error downloading packages: containerd.io-1.6.27-3.1.el7.x86_64: [Errno 256] No more mirrors to try.

可以重新配置源:

1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装Docker

最后,执行命令,安装Docker

1
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动和校验

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启动Docker
systemctl start docker

# 停止Docker
systemctl stop docker

# 重启
systemctl restart docker

# 设置开机自启
systemctl enable docker

# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps

配置镜像加速

具体命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建目录
mkdir -p /etc/docker

# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF

# 重新加载配置
systemctl daemon-reload

# 重启Docker
systemctl restart docker

docker中安装mysql

1
2
3
4
5
6
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql

image-20240123202634329

docker常见命令

进入到容器中,模拟了一个虚拟机

docker exec -it nginx bash

image-20240123203355618

docker数据卷

image-20240123210140212

image-20240123210217824

image-20240123211231059

这里的docker run创建数据卷挂载需要创建容器时就要进行

例如:docker run -d –name nginx -p 80:80 -v html:/usr/share/nginx/html nginx

html是数据卷的名字,/usr/share/nginx/html是nginx容器内的路径

可以使用docker volume inspect html查看其挂载到宿主机中的路径

挂载到指定目录

image-20240124105805826

1
2
3
4
5
6
7
8
9
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql/conf.d \
mysql

需要提前在/root/mysql/init中放入sql文件;在/root/mysql/conf放入cnf

dockerfile

image-20240124142154431

自定义镜像

  • 上传jdk.tar

  • docker加载该压缩包:

    1
    docker load -i jdk.tar
  • docker build -t docker-demo .
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    > 这一步最后的.执行同目录下的dockerfile文件,文件内容如下:
    >
    > ```bash
    > # 基础镜像
    > 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"]
    > >

镜像建立完毕,可以利用该镜像建立容器

  • docker run -d --name dd -p 8080:8080 docker-demo
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13



    <img src="https://s2.loli.net/2024/01/27/NqWMSQUJ6ReZKmT.png" alt="image-20240124145540738" style="zoom:67%;" />

    #### 自定义网络

    ![image-20240124153633494](https://s2.loli.net/2024/01/27/WtiDAeXdxET24pN.png)

    - 创建一个网段

    ```bash
    docker network create heima
  • 查看网络,出现以下内容:

    1
    2
    3
    4
    5
    NETWORK ID     NAME      DRIVER    SCOPE
    311693af612c bridge bridge local
    0781a864bf35 heima bridge local
    e939b148e85a host host local
    daf3260b0528 none null local
  • 将容器mysql加入到刚才新创建的网段heima中

    1
    docker network connect heima mysql

    也可以直接在创建容器时设置网段:

    1
    docker run -d --name dd -p 8080:8080 --network heima docker-demo

部署java应用

  • 将java项目打包成jar包,将对应的jar包和dockerfile文件上传到同一目录下

  • 在这个目录下,创建镜像

    1
    docker build -t hmall
  • 可查看镜像

    1
    docker images
  • 创建容器

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

    network配置heima网段,mysql也在里面

    hmall为镜像名称

  • 根据后端接口在浏览器访问即可访问到mysql中的数据

DockerCompose

gimage-20240127121155824

image-20240127121128255

dockerCompose命令格式

image-20240127121927040

可以将所有的文件放在同一目录下,这样直接使用相对路径

1
docker compose up -d

一键部署

dockercompose配置文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall