Docker教程

Docker 教程

简单介绍:

image-20240930190525374

一、基础:安装Docker

用ubuntu 系统来做演示

  1. 删除系统里面原有的镜像
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
  1. 设置 Docker 的apt存储库。
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
  1. 安装 Docker 包命令
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  1. 安装完毕,设置开机启动
sudo systemctl enable docker 
  1. 配置加速镜像

    https://www.cnblogs.com/alex-oos/p/18417200

  2. 修改一下docker 必须用sudo权限才能生效
    https://blog.csdn.net/yudelian/article/details/105135694

其他系统请参考官方文档:

https://docs.docker.com/engine/install

二、命令

1. 命令:镜像操作

image-20240930193155629

  1. docker search 检索+,名称,一般可以搜索出来各种版本的镜像,带office 的名称就是官方的镜像,其他的很有可能就是个人的

    docker search nginx
    

    image-20240930191801393

  2. docker pull 下载

    #docker 拉取镜像,镜像名+版本号,默认拉取的是latest版本
    docker pull nginx:latest
    

    image-20240930192436708

  3. docker images 查看本地镜像列表

    docker images 
    

    image-20240930192712982

  4. docker rmi 删除镜像

    删除的时候,可以使用唯一id,也可以使用镜像名,如果镜像被占用就删除不了

    docker rmi nginx
    

    image-20240930192752612

2. 命令:容器操作

image-20240930193239892

  1. 运行docker run

    docker run + 镜像名

docker run -d --name=mynginx nginx

image-20240930194156684

  1. docker ps 查看此刻所有运行的容器
docker ps 

# 查看所有容器
docker ps -a 
# 过滤中你想要的容器名称
docker ps -a | grep '容器名'

image-20240930194334625

  1. docekr stop 停止 +容器名/容器id
docker stop mynginx
docker stop 95c7e10581f3

image-20240930194525624

  1. docker start 启动 +容器名/容器id
docker start mynginx 
docker start 95c7e10581f3

  1. docker restart 重启 +容器名/容器id
docker restart mynginx 
docker restart 95c7e10581f3
  1. docker stats 状态+容器名/容器id

    查看cpu,内容,占用率

docker stats mynginx 
docker stats 95c7e10581f3

image-20240930194815752

  1. docker logs 日志 ++容器名/容器id
docker logs mynginx

image-20240930194937610

  1. docker exec 进入容器

    -it 交互式进入

    /bin/bash 用bash的启动指令

#docker exec -it +容器名称/容器id  /bin/bash 
docker exec -it mynginx /bin/bash
  1. docekr rm 删除 +容器名/容器id

    注意:如果容器处于运行状态无法删除,先停止容器运行,在进行删除操作,强制-f 不推荐使用,仅仅知道即可

docker rm mynginx 
docker rm 95c7e10581f3
#强制
docker rm -f mynginx 

3. 命令:run 细节

docker run +镜像名

  1. -d 后台运行
  docekr run  -d nginx
  1. --name +容器名 +镜像名
docker run --name=mynginx nginx:latest
  1. -p 端口映射 本机端口:容器端口
docker run -p 80:80  --name=mynginx nginx:latest

4.命令:保存镜像

image-20240930200825714

  1. docker commit 提交容器,将容器提交一下
   docker commit -m '注释' 容器名
  1. docker save 将镜像保存为一个文件
#docker save -o +文件名 + 镜像
docker save -o 'mynginx.tar' nginx
  1. docker load 将文件加载为一个镜像
# docker 加载文件
docker load -i mynginx.tar

5. 命令:分享镜像

image-20240930201112946

docekr hub 地址:https://hub.docker.com/

介绍:docker hub 其实主要是用于存储docekr镜像的地方,类似于github,首先需要注册一下,然后将对应的镜像给push上去

docker login 登录 输入你的账号与密码,即将登录成功

docker login 

docker tag 设置标签

docker tag [OPTIONS] IMAGE [NAME[:TAG]]
  • IMAGE:要打标签的镜像的 ID 或名称。
  • [NAME[:TAG]]:新的标签名称,其中 NAME 是仓库的名称,TAG 是标签。

demo:

一般做的时候,做一个指定版本,在做一个最新版本的,这样子方便别人拉取到最新版本的

# 设置标签
docker tag  mynginx:v1  alexoos/nginx:v1
# 设置完查看一下镜像
docker  images
docker tag  mynginx:v1  alexoos/nginx:latest

docker push 推送 + 镜像名称

docker push alexoos/nginx:latest

三、存储

docker ps -aq 打印所有的容器id

# 打印所有容器的id
docker ps -aq 
# 批量删除所有未运行的容器
docker rm $(docker ps -aq)

1. 存储:目录挂载

命令: -v 目录挂载 本地目录:容器目录

目录挂载主要是以外面的文件夹为准,如果目录挂载时外面的文件夹,没有文件,那么里面的也没有文件

如果本地目录不存在,会自动进行创建目录

docker run -d -p 81:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx

目录挂载的作用:

  1. 容器内将内容修改后,会自动同步到本地目录,一劳永逸的方式

  2. 将数据持久化,不担心数据会丢失,容器丢失,数据仍然存在

2. 存储:卷映射

-v 卷映射 -v ngconf:/etc/nginx

卷映射:是以容器内部的文件夹为准,第一次启动,内部有数据,将内部的数据映射到外部

应用范围:

  • 用于配置挂载
  • 用于本地不存在,但是容器启动又必须读取的配置
# -v 卷名:容器目录
-v ngconf:/etc/nginx
#  启动容器,使用目录挂载,卷映射,如果卷不存在,就自动创建
docker  run  -d -p 99:80 -v /app/nghtml:/usr/share/nginx/html -v ngconf:/etc/nginx --name app02 nginx
# 卷目录的默认路径
/var/lib/docker/volumes/<volume-name>
# 列出所有的卷
docker volume  ls
# 查看某个卷的详细信息
docker volume inspect ngconf (卷名)

四、网络

介绍:

分为默认网络与自定义网络

1. 默认网络是docker0

查看默认网络:ip a ,找到docker0 发现 inet 为 172.17.0.1/16 ,这个一般都是默认网络

image-20241010152227138

docker 一般每启动一个容器,默认会给容器一个ip地址,直接访问容器内的数据,可以使用容器ip+容器端口互相访问

查看容器的ip的相关命令

# 启动一个容器
docker run -d -p 8011:80 --name app01 nginx
# docker inspect + 容器名,直接看network,network 下面有相关的ip地址,一般是172.17.0.1 这个网段
docker inspect app01

image-20241010152113231

2. 网络-自定义网络

自定义网络:其实就是为了方便A容器与B容器直接访问,因为ip 容易发生改变,所以自定义开辟一个网络,这样子用容器名+端口互相访问,更加高效与便捷

# 自定义网络相关命令 先输入--help 方便查看如何使用
docker network  --help
docker network create mynet

自定义网络的网段一般是:172.22.0.1

启动容器的时候,加入 --network 参数即可

启动的容器就加入了自定义网络了

docker run -d -p 88:80 --name app01 --network mynet nginx 
docker run -d -p 88:80 --name app02 --network mynet nginx 
#访问的时候,直接用容器名+端口即可

设置完毕之后,两个容器内相互访问直接用 curl http://app01:80 直接就访问成功了,只有在容器内相互访问才可以,在容器外访问不行

如果想设置都可以访问,建议使用自定义网络,设置自定义网段 +固定ip地址,这样子才可以,参考项目为:

https://gitee.com/alex-oos/kinit/blob/master/docker-compose.yml 这个设置的相对标准一些

3. 网络-redis主从集群

先不补充,后期补充,

五、Docker compose

介绍:

批量管理容器的工具

首先需要准备一个docker-compose.yml 文件

常用的命令如下:

#上线 (启动并且创建所有容器)
docker-compose up -d
# 重启所有容器
docker-compose restart

# 停止所有容器 下线
docker-compose down

# 查看所有容器状态
docker-compose ps -a
# 启动单个容器
docker-compose start x1 x2 x3 
# 停止多个容器
docker-compose stop x1 x2 x3 
# 扩容容器 扩容 x 2=3 代表 x2容器启动3个
docker compose scale x2=3 

举例 :需要安装 wordpress

正常安装步骤

  1. 创建网络 blog

    docker network create blog 
    
  2. 创建容器mysql

    docker run --name wordpress-db -e MYSQL_ROOT_PASSWORD=yourpassword -e MYSQL_DATABASE=wordpress --network wordpress-net -d mysql:8.0
    
  3. 创建容器 wordpress

    docker run --name wordpress -e WORDPRESS_DB_PASSWORD=yourpassword -e WORDPRESS_DB_HOST=wordpress-db:3306 -p 80:80 --network wordpress-net -d wordpress
    

使用 docker-compose,一个文件即可

创建一个docker-compse.yml 文件,文件如下

name: myblog 
services:
  mysql:
    # 容器名 
    container_name: mysql
    # 镜像
    image: mysql:8.0
    # 端口
    ports:
      - "3306:3306"
    # 环境变量
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=wordpress
    # 挂载卷
    volumes:
      # 卷映射
      - mysql-data:/var/lib/mysql
      # 目录挂载
      - /app/mysql/conf.d:/etc/mysql/conf.d
    # 自动重启
    restart: always
    # 网络
    networks:
      blog_network:
        ipv4_address: "177.8.0.2"
  wordpress:
    container_name: wordpress
    image: wordpress:latest
    ports:
      - "9011:80"
    environment:
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
    volumes:
      - wordpress:/var/www/html
    restart: always
    networks:
      blog_network:
        ipv4_address: "177.8.0.3"
    depends_on:
      - mysql
    

# 持久化存储卷
volumes:
  mysql-data:
  wordpress:

networks:
  blog_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: "177.8.0.0/16"
          gateway: "177.8.0.1"
  

进入到文件下,执行下面命令

docker-compse up -d 

六、DockerFile

1. 基础使用

常用命令:

image-20241010181706036

文件内需要包含

  • 基础环境
  • 软件包
  • 启动命令

比如:启动一个java 服务,建议将基础环境与代码软件分开,这里是写的所有,比较全,其实也可以直接用网上的镜像也是可以的

创建一个文件Dockerfile

# 步骤1: 从Ubuntu 24操作系统开始构建
FROM ubuntu:24.04

#  添加标签,可以设置用户名
LABEL maintainer="alex <alex@qq.com>"

# 步骤2: 修改镜像源为阿里镜像源
RUN mkdir -p /etc/apt/ \
    && echo "deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse" > /etc/apt/sources.list \
    && echo "deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse" >> /etc/apt/sources.list \
    && echo "deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse" >> /etc/apt/sources.list \
    && echo "deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse" >> /etc/apt/sources.list \



# 步骤3: 修改时间为亚洲上海时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone

    # 更新软件包列表
RUN apt update
# 步骤4: 安装中文语言包
RUN apt install -y language-pack-zh-hans \
    && locale-gen zh_CN.UTF-8 \
    && update-locale LANG=zh_CN.UTF-8

# 设置环境变量 ,这里必须设置,不然中文语言包不生效
ENV LANG=zh_CN.UTF-8

# 步骤5: 安装Java开发工具包(JDK)
RUN apt install -y openjdk-11-jdk

# 步骤6: 安装Maven
RUN apt install -y maven


RUN  apt install -y vim

# 步骤8: 使用curl下载阿里云的Maven settings.xml并替换默认配置
# 请将下面的URL替换为阿里云官方提供的settings.xml文件的URL
# RUN mkdir -p /root/.m2 \
#     && curl -o /root/.m2/settings.xml [阿里云官方settings.xml文件的URL]

# 将本地镜像源,copy到镜像中
COPY settings.xml /root/.m2/

# 清理缓存和不必要的文件
RUN apt clean \
    && rm -rf /var/lib/apt/lists/*

# 工作目录设置为/app
# WORKDIR /app

# 可选:将你的应用代码复制到工作目录
# COPY . /app

# 可选:暴露端口
# EXPOSE 8080

# 可选:运行你的应用
# CMD ["mvn", "命令"]

执行下面命令 将基础镜像打包成一个基础环境,不包含代码

    docekr build -t  ubuntu-jdk-11-base-env ./

引用基础镜像,然后继续将代码打包到镜像中

FROM  ubuntu-jdk-11-base-env:latest
#  指定工作目录
WORKDIR /home/work
COPY . /home/work
RUN cd /home/work  && mvn  -B clean install -P${env} -Dmaven.test.skip=true -Dautoconfig.skip -pl springboot-server -am  && cp -r springboot-server /target target

# 暴露端口
EXPOSE 8080

#  容器固定启动命令
# ENTRYPOINT ["/bin/bash"]

# 容器启动命令或参数 (拼接在 ENTRYPOINT 后面)
CMD  java  -Dfile.encoding=utf-8  -jar target/springboot-server .jar

全流程


# 从某一个基础镜像创建
FROM  Ubuntu:20.04
#  添加标签,可以设置用户名
Label author="Alex"
#  指定工作目录
WORKDIR /home/work
COPY . /home/work

# 安装基础环境,jdk,mavn ,git 
RUN apt-get update && apt-get install -y openjdk-11-jdk && apt-get install -y maven && apt-get install -y git

# 构建指定参数
ARG env

# 运行自定义命令
RUN cd /home/work && mvn  -B clean install -P${env} -Dmaven.test.skip=true -Dautoconfig.skip -pl semi-automatic-migration-server -am  && cp -r semi-automatic-migration-server/target target


# 暴露端口
EXPOSE 8080

#  容器固定启动命令
# ENTRYPOINT ["/bin/bash"]

# 容器启动命令或参数 (拼接在 ENTRYPOINT 后面)
CMD  java  -Dfile.encoding=utf-8  -jar target/semi-automatic-migration-server.jar

参考项目如下:
https://gitee.com/alex-oos/DockerProject/tree/main/ubuntu-java-base

docker 构建命令如下:

# docker build --build-arg env=环境 -t 镜像名 . (点是当前目录的意思)
docker build --build-arg env=test  -t demo1 .

docker build 参数

--build -arg 参数构建传递

-t 镜像名

--file +文件名 指定文件,如果不在当前目录下,或文件名不为Dockerfile 就需要这个参数

2. 镜像分层机制

​ 基础环境做第一层,代码做第二层,一般都是这样子使用即可

image-20241010184544175

参考文档:

视频资料地址:

https://www.bilibili.com/video/BV1Zn4y1X7AZ?p=1&vd_source=e33a356475cf6a18a9f6345f4e44a209

Docker官方文档(英文版)

https://docs.docker.com/get-started/

https://docs.docker.com/engine/reference/builder/

优秀blog(中文版)

https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

https://chinese.freecodecamp.org/news/the-docker-handbook/

posted @ 2024-10-31 11:09  快乐小王子帅气哥哥  阅读(64)  评论(2编辑  收藏  举报

Loading