Docker

1.安装

Docker官方文档,地址如下:

Install Docker Engine on CentOS | Docker Docs

2.卸载旧版

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

yum remove docker \
    docker-client \
    docker-client-latest \
    docker-common \
    docker-latest \
    docker-latest-logrotate \
    docker-logrotate \
    docker-engine
2.配置Docker的yum库

首先要安装一个yum工具

yum install -y yum-utils

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

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
3.安装Docker

最后,执行命令,安装Docker

yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
4.启动和校验
# 启动Docker
systemctl start docker
​
# 停止Docker
systemctl stop docker
​
# 重启
systemctl restart docker
​
# 设置开机自启
systemctl enable docker
​
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
5.配置镜像加速

这里以阿里云镜像加速为例。

5.1.注册阿里云账号

首先访问阿里云网站:

阿里云-计算,为了无法计算的价值

注册一个账号。

5.2.开通镜像服务

在首页的产品中,找到阿里云的容器镜像服务

点击后进入控制台:

首次可能需要选择立刻开通,然后进入控制台。

5.3.配置镜像加速

找到镜像工具下的镜像**加速器**:

页面向下滚动,即可找到配置的文档说明:

具体命令如下:

# 创建目录
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

2.快速入门

docker的镜像能够做到忽略操作系统的环境,能实现跨系统运行.

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

就是上面的 mysql

3.常见命令

1.常见命令

  • docker pull 把远端镜像拉取到本地

  • docker images 查看所有本地镜像

  • docker rmi 删除镜像

  • docker build 自己构建镜像

  • docker save 把本地镜像保存到本地变成一个压缩文件(然后你的运维同事就可以拿U盘来拷了)

  • docker load 把压缩文件加载到镜像当中

  • docker push 把本地镜像推到仓库中(这样可以让你的同事pull下来,上面拷贝的笨方法太low了)

  • docker run 自动化创建容器并运行(要是没镜像会自动取拉取,再创建容器,再运行)

  • docker stop 停止进程(不删除容器)

  • docker start 启动进程(不创建容器)

  • docker ps 查看当前容器的运行状态

  • docker rm 删除容器

  • docker logs 查看日志

  • docker exec 进入容器内部(然后可以执行一些其他命令来进行修改)

2.案例:

查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器

拉取nginx镜像

docker pull nginx

查看本地镜像列表

docker images

把镜像保持到本地

docker save -o nginx.tar nginx:latest

删除镜像(删除nginx镜像)

docker rmi nginx:latest

把上面本地的nginx包导入本地镜像

docker load -i nginx.tar

创建容器并运行

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

停掉

docker stop nginx

启动

docker start nginx

4.数据卷

容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便.

  • 如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?

  • MySQL、Nginx容器运行后,如果我要修改其中的某些配置该怎么办?

  • 我想要让Nginx代理我的静态资源怎么办?

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

1.什么是数据卷

数据卷(volume)是一个虚拟目录,是容器内目录宿主机**目录**之间映射的桥梁。

以Nginx为例,我们知道Nginx中有两个关键的目录:

  • html:放置一些静态资源

  • conf:放置配置文件

使用docker命令可以创建两个数据卷(html与conf),然后docker就会在宿主机(容器所在的机器)准备真实的目录(固定在var/lib/docker/volumes下创建对应的目录),然后数据卷与其进行映射,然后再让Nginx容器内的conf目录与html目录对数据卷进行关联挂载.

这时Docker会对Nginx容器的conf,html目录与宿主机的conf,html目录分别进行双向绑定和映射,所以数据卷是桥梁.

2.常见命令
docker volume --help

查看相关命令

如果我们要让Nginx代理我们的静态资源,最好是放到html目录;如果我们要修改Nginx的配置,最好是找到conf下的nginx.conf文件。

3.案例

  • 挂载的动作一定要在创建时进行,已经创建了的话是不能进行次操作的,所以要把之前的容器删了重新创建

  • 加上-v的命令后,不需要我们主动去执行 docker volume create,因为他是自动创建数据卷的

记得去docker的官方nginx看看目录

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

数据卷也创建出来了

查看html的详细数据

这时他们已经双向绑定并且映射了

cd /var/lib/docker/volumes/html/_data

cat index.html

这时我们可以cd过去查看,发现这是nginx的欢迎文档

然后可以通过点击左边的index.html直接修改了(这里用的MobarXterm对VMware来操作)

# 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
  
  记得要在root~目录下来创建
# 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.镜像

1.自定义镜像

比如我们java后端程序写完了要部署到Linux服务器上.我们就需要把我们的项目的函数库和环境(jre等等)一并部署,使docker能直接部署,这时就需要自定义成镜像了.

在上面分层图中的最顶端的启动脚本--也被称为入口 EntryPoint ,就是我们的这个镜像应用启动的时候就是通过这个脚本启动,比如上图的java -jar等等,使你的容器start的时候直接把你后端服务器程序也启动了

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

有很多现成的JDK基础框架集成了很多东西(如右图的一行把左图的绝大部分都集成了),所以Dockerfle的指令不怎么需要及.我们只需要看懂就行.然后保存个模板.然后需要镜像的时候改下基础镜像的jdk就好了.

# 指定基础镜像
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"]
# 基础镜像
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"]
2.自定义镜像例子

  • 注意:由于Dockerfile文件里的拷贝写的是相对路径.所以这个文件得和jar包放在同个目录下

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

丢到目录里

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

# 进入镜像目录
cd /root/demo
# 开始构建
docker build -t docker-demo:1.0 .

命令说明:

  • docker build: 就是构建一个docker镜像

  • -t docker-demo:1.0-t参数是指定镜像的名称(repositorytag

  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

然后运行

然后可以查看下日志

这样的话我们就成功啦

6.网络

1.介绍

查看这两个容器配置中的网络配置,其中的IP

docker inspect mysql

docker inspect nginx

  • IP是可变的,要是下次重启时别的容器先启动了,这个IP地址就会被它占去了,而当前容器就会使用后面的IP,所以为了解决这个问题,我们需要自定义网络

2.自定义网络

  • 自定义网络会新建一个自定义网桥,它的网段和默认的网桥不一样,加入这个自定义网络的容器就可以互联,并且可以通过容器名互联

查看所有网络

docker network ls

创建自定义网络n1

docker network ls

查看网卡,发现最下面多了一个新网卡

ip addr

使mysql容器加入我们新建的n1网络

docker network connect n1 mysql

查看后发现它的网络设置对了一个网桥(默认的网桥网段是17,n1的网段是18)

docker inspect mysql

我们也可以在容器创建的时候就使其加入自定义网络

先停止,再删除原有的nginx容器,最后再创建它的同时使其加入自定义网络

docker stop nginx

docker rm nginx

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

最后查看它

docker inspect nginx

发现只有自定义网桥了.没有默认网桥了.

7.部署项目流程(我用的是黑马视频老师给的用例项目)

1.配置后端

记得把你后端项目打包,并且把jar包和dockfile文件丢入/root/下(Dockerfile文件是hm-service文件下的,打包是打包父工程,下面这图是打包好的,就把)

把jar包和Dockerfile文件丢入/root/下

# 1.构建项目镜像,不指定tag,则默认为latest
docker build -t hmall .

# 2.查看镜像
docker images
# 结果
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
hmall         latest    0bb07b2c34b9   43 seconds ago   362MB
docker-demo   1.0       49743484da68   24 hours ago     327MB
nginx         latest    605c77e624dd   16 months ago    141MB
mysql         latest    3218b38490ce   17 months ago    516MB

# 3.创建并运行容器,并通过--network将其加入hmall网络,这样才能通过容器名访问mysql
docker run -d --name hmall --network hmall -p 8080:8080 hmall

2.配置前端
  1. 删掉之前的nginx.(没删成功可能是nginx容器在运行,要先stop)

    docker rm -f nginx

  2. 在/root下创建nginx文件夹.

  3. 把你配置好的前端nginx内容复制进nginx文件夹

  4. 创建nginx容器(同时配置好数据卷映射,使其和上面我们/root/nginx的文件双向绑定)

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 n1 \
  nginx
3.配置数据库
  1. 删掉之前的mysql.(没删成功可能是mysql容器在运行,要先stop)

    docker rm -f mysql

  2. 在/root下创建mysql文件夹.

  3. 把你配置好的mysql内容复制进mysql文件夹,在创建个data空文件夹(不创建没事,会自动创建)

  4. 创建mysql容器(同时配置好数据卷映射,使其和上面我们/root/mysql的文件双向绑定)

# 1.删除原来的MySQL容器
docker rm -f mysql

# 2.进入root目录
cd ~

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 \
  --network n1 \
  mysql
4.这时你可以去网页去访问啦!

8.DockerCompose

1.介绍

上面7的配置是手动一步一步来的,而这个DockerCompose可以来快速部署

一个DockerCompose文件,对应一个完整的项目.然后前端,后端,数据库啥的就称为服务

以mysql为例子,看看区别

2.基本语法

官方文档: Compose file version 3 reference | Docker Docs

看看就得了

对比如下:

docker run 参数docker compose 指令说明
--namecontainer_name容器名称
-pports端口映射
-eenvironment环境变量
-vvolumes数据卷配置
--networknetworks网络

所以7可以替换为已下docker-compose文件

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:
      - n1
  hmall:
    build: 
      context: .
      dockerfile: Dockerfile
    container_name: hm
    ports:
      - "8080:8080"
    networks:
      - n1
    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:
      - hm
    networks:
      - n1
networks:
      n1:
    name: hmall
3.一键部署

记得先把docker-compose文件放到/root目录下

docker compose [OPTIONS] [COMMAND]

# 1.进入root目录
cd /root

# 2.删除旧容器
docker rm -f $(docker ps -qa)

# 3.删除hmall镜像
docker rmi hmall

# 4.清空MySQL数据
rm -rf mysql/data

# 5.启动所有, -d 参数是后台启动
docker compose up -d
# 结果:
[+] Building 15.5s (8/8) FINISHED
 => [internal] load build definition from Dockerfile                                    0.0s
 => => transferring dockerfile: 358B                                                    0.0s
 => [internal] load .dockerignore                                                       0.0s
 => => transferring context: 2B                                                         0.0s
 => [internal] load metadata for docker.io/library/openjdk:11.0-jre-buster             15.4s
 => [1/3] FROM docker.io/library/openjdk:11.0-jre-buster@sha256:3546a17e6fb4ff4fa681c3  0.0s
 => [internal] load build context                                                       0.0s
 => => transferring context: 98B                                                        0.0s
 => CACHED [2/3] RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo   0.0s
 => CACHED [3/3] COPY hm-service.jar /app.jar                                           0.0s
 => exporting to image                                                                  0.0s
 => => exporting layers                                                                 0.0s
 => => writing image sha256:32eebee16acde22550232f2eb80c69d2ce813ed099640e4cfed2193f71  0.0s
 => => naming to docker.io/library/root-hmall                                           0.0s
[+] Running 4/4
 ✔ Network hmall    Created                                                             0.2s
 ✔ Container mysql  Started                                                             0.5s
 ✔ Container hmall  Started                                                             0.9s
 ✔ Container nginx  Started                                                             1.5s

# 6.查看镜像
docker compose images
# 结果
CONTAINER           REPOSITORY          TAG                 IMAGE ID            SIZE
hmall               root-hmall          latest              32eebee16acd        362MB
mysql               mysql               latest              3218b38490ce        516MB
nginx               nginx               latest              605c77e624dd        141MB

# 7.查看容器
docker compose ps
# 结果
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
hmall               root-hmall          "java -jar /app.jar"     hmall               54 seconds ago      Up 52 seconds       0.0.0.0:8080->8080/tcp, :::8080->8080/tcp
mysql               mysql               "docker-entrypoint.s…"   mysql               54 seconds ago      Up 53 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp
nginx               nginx               "/docker-entrypoint.…"   nginx               54 seconds ago      Up 52 seconds       80/tcp, 0.0.0.0:18080-18081->18080-18081/tcp, :::18080-18081->18080-18081/tcp
# 8.停止服务
docker compose down

9.学习来源

图片基本来源视频截图

黑马原视频:14.项目部署-DockerCompose_哔哩哔哩_bilibili

微服务文档:Docs

  • 37
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值