Docker学习

文章目录

  • 1. 快速入门
    • 1.1 配置Docker的yum库
    • 1.2 安装docker
    • 1.3 启动和校验
    • 1.4 安装MySQL
    • 1.5 常用命令
  • 2. Docker基础
    • 2.1 常见命令
    • 2.2 数据卷
    • 2.3 本地目录挂载
    • 2.4 自定义镜像
      • 2.4.1 镜像结构
      • 2.4.2 Dockerfile
      • 2.4.3 构建镜像
    • 2.5 网络
  • 3. 项目部署
    • 3.1 DockerCompose
      • 3.1.2 基本语法
      • 3.1.2 基本命令

参考文档链接: https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d

Docker学习

1. 快速入门

当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:DockerHub。

1.1 配置Docker的yum库

  • 安装yum工具

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    
  • 使用阿里云更新yum源

    curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
  • 清除yum

    yum clean all
    
  • 更新缓存

    yum makecache
    

1.2 安装docker

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

1.3 启动和校验

启动Docker
systemctl start docker

停止Docker

systemctl stop docker

重启
systemctl restart docker

设置开机自启
systemctl enable docker

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

1.4 安装MySQL

  • 使用下面的命令来安装MySQL:

     docker run -d \
    	--name mysql-test \
    	-p 3306:3306 \
    	-e TZ=Asia/Shanghai \
    	-e MYSQL_ROOT_PASSWORD=123 \
    	mysql:8.0.36
    
    • docker run:创建并运行一个容器,-d 是让容器在后台运行
    • –name mysql:给容器起个名字,必须唯一
    • -p 3306:3306:设置端口映射 宿主机端口:容器端口
    • -e KEY=VALUE:设置环境变量
    • mysql:指定运行的镜像的名字 [repository]:[tag] 镜像名:镜像版本
  • 此时,通过命令查看mysql容器:

    docker ps
    

1.5 常用命令

运行已创建的容器

docker start mysql

停止正在运行的容器

docker stop mysql

删除容器

docker rm mysql

查看所有容器(包括已经停止的容器)

docker ps -a

2. Docker基础

2.1 常见命令

Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/

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

第2步,拉取Nginx镜像
docker pull nginx

第3步,查看镜像
docker images
结果如下:
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    605c77e624dd   16 months ago   141MB
mysql        latest    3218b38490ce   17 months ago   516MB

第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx

第5步,查看运行中容器
docker ps
也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

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

第7步,停止容器
docker stop nginx

第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

第9步,再次启动nginx容器
docker start nginx

第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"

查看日志 -f持续跟踪
docker logs -f nginx 

第11步,查看容器详细信息
docker inspect nginx

第12步,进入容器,查看容器内目录
docker exec -it nginx bash
或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p

第13步,删除容器
docker rm nginx
发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx

2.2 数据卷

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

命令说明
docker volume create创建数据卷
docker volume ls查看所有数据卷
docker volume rm删除指定数据卷
docker volume inspect查看某个数据卷的详情
docker volume prune清除数据卷


在执行docker run命令时,使用 -v数据卷:容器内目录 可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷

  • 创建数据卷
    docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
    
     docker volume ls
    
  • 查看数据卷详情
    docker volume inspect html
    

2.3 本地目录挂载

  • 查看容器信息

    docker inspect mysql-test
    

  • 在执行docker run命令时,使用**-v 本地目录:容器内目录** 可以完成本地目录挂载

  • 本地目录必须以“/”或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录

    • -v mysql:/var/lib/mysql 会被识别为一个数据卷叫mysql
    • -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录

参考过程:https://b11et3un53m.feishu.cn/wiki/R4Sdwvo8Si4kilkSKfscgQX0niB

2.4 自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

2.4.1 镜像结构


2.4.2 Dockerfile

由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:

其对应的语法可以参考官方文档:https://docs.docker.com/engine/reference/builder/

例如,要基于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"]

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

基础镜像
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.4.3 构建镜像

当编写好了Dockerfile,可以利用下面命令来构建镜像:

docker build -t docker-demo:1.0 .
  • docker build : 就是构建一个docker镜像
  • -t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
  • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

2.5 网络

默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:

容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。

通过自定义网络会建立新的网桥,加入自定义网络的容器才可以通过容器名互相访问
Docker的网络操作命令如下:
官方文档:
https://docs.docker.com/engine/reference/commandline/network/

命令说明
docker network create创建一个网络
docker network ls查看所有网络
docker network rm删除指定网络
docker network prune清除未使用的网络
docker network connect使指定容器连接加入某网络
docker network disconnect使指定容器连接离开某网络
docker network inspect查看网络详细信息
  • 自定义网络

    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
    

3. 项目部署

3.1 DockerCompose

3.1.2 基本语法

Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署

如果用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"
    networks:
      - new
networks:
  new:
    name: hmall

3.1.2 基本命令

基本语法如下:

docker compose [OPTIONS] [COMMAND]

其中,OPTIONS和COMMAND都是可选参数,比较常见的有:

版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/74769.html