docker

1. 概念

image

  • Image 镜像

内置了某个应用程序的OS。

  • Container 容器

运行者某个应用程序的一个简化linux系统。
一个tomcat镜像-》run->可以创建多个容器01,02,最终项目运行在容器中。独立运行一个或一组应用,通过镜像创建。
启动、停止、删除等命令。

  • Repository 仓库

用来放镜像的,分公有仓库、私有仓库。类似gitee,maven,docker官方的是全球共有的远程中央仓库,自己账号下可管理自己推送的仓库镜像

2. 乌班图2204安装

亲测成功,照着一步步执行:

# 升级 apt
sudo apt update
# 安装docker
sudo apt install docker.io docker-compose
# 将当前用户加入 docker组
sudo usermod -aG docker ${USER}
# 测试一下
docker ps -a
docker run hello-world

3. wsl安装

win先通过wsl安装ubuntu, 先保证是64位

  • 查看ubuntu系统是32位的还是64位的:getconf LONG_BIT

  • 查看操作系统架构:uname -a

  • 检查是否已经安装docker: docker --version

  • 卸载旧版本
    sudo apt-get remove docker docker-engine docker.io containerd runc

  • 添加Docker官方GPG key
    国内阿里云版 sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -

  • 验证key的指纹
    sudo apt-key fingerprint 0EBFCD88

  • 正常会显示:
    image

  • 添加仓库(阿里云版):

点击查看代码
sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
  • sudo apt-get update
  • 安装最新版本的docker ce和containerd
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 验证:docker --version

4. 云服务器安装

官网文档有
image
1:粘贴命令:sudo yum install -y yum-utils
后面2,3,4命令用一行执行
2:粘贴命令:yum-config-manager
3:粘贴命令:--add-repo
4:粘贴命令:https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
成功提示:
image

上面三条执行成功,再执行下面
5:下载:yum install -y docker-ce

5. 启动docker

image
image

5.1. 配置国内镜像

5.1.1. 阿里镜像

需要有阿里云账号,或者阿里云服务器
阿里每个人的加速地址都不一样。
找不到的话,可以全局搜索:镜像加速器
image

  • 如果用yum方式配置失败,可用json方式
    image

  • json方式
    image

5.1.2. 改为国内镜像

cat /etc/docker/daemon.json
vi /etc/docker/daemon.json

1:修改镜像源

json文件内容
{
"registry-mirrors":["https://docker.m.daocloud.io","https://docker.lpanel.live"]
}
2: 重新加载配置文件
sudo systemctl daemon-reload
3:重启docker
sudo systemctl restart docker

image
image

6. 命令

官方文档地址:
https://docs.docker.com/reference/
image

// 信息
docker info
// 命令字典
docker --help

6.1. 镜像命令

6.1.1. 导入导出

// 导出镜像到磁盘tar包
// /tmp/docker/erlang.tar 磁盘位置
// docker save -o 命令
// erlang REPOSITORY名称
// 25.2: TAG
docker save -o /tmp/docker/erlang.tar erlang:25.2
// 导入镜像(在当前目录下)
docker load -i edge.tar

// 所有已安装镜像
docker images
// 通过id删除镜像
docker rmi -f f2ad9f23df82
// 删除所有未启动的镜像
docker rmi -f $(docker images -aq)
// 查看该镜像的版本号
docker image inspect mongo:latest|grep -i version

6.1.2. 提交镜像到自己仓库下

1:去dockerhub注册自己账号,地址:https://hub.docker.com/
2:shell客户端,docker login -u 用户名密码登录
登录成功,会提示/root/.docker目录下生成config.json文件
3:将镜像列表中的镜像 打上tag, 必须已本账号开头
image

6.2. 容器命令

  • ps 正在运行的容器实例

  • dokcer logs -f -t --tail [条数] 容器id #容器日志

  • docker inspect 容器id # 容器的详细信息
    // 根据容器id删除容器
    docker rm -f cc01f379fa16

  • 拉取
    // 拉取镜像指定版本(tag)
    docker pull centos:centos6

  • 启动容器
    // 第一次创建并启动
    // -p -v 前面是宿主机,冒号:后面是容器的
    docker run -d --name nginx2 -p 80:80 ae893c58d83f
    image

  • 重启
    // 停掉后重起(不管是否已经启动,没起则起,起了就重启)
    docker restart 容器id

  • 停掉容器
    docker stop 94193e4ce731 // 容器id

  • 开启容器
    // 针对stop以后,想重新启动
    docker start 容器id

  • 进入容器
    docker exec -it 69356f406e7d /bin/bash

  • 退出容器
    exit

  • cp 拷贝
    可以把容器里面的文件拷贝到宿主机。
    也可以把宿主机的文件拷贝到容器里面。

6.3. 数据卷挂载

// 将前面的宿主机的/root目录,挂载到容器的/root里
// 默认是rw 可读可写,ro 只读

  • 关键字
    -v /root:/root
    容器的哪些文件应该挂载到宿主机,并且在哪个位置?
    dockerHub官方一般有介绍;或者查看dockerfile
  • 列出所有数据卷
    docker volume ls
  • 查看数据卷信息
    docker volume inspect NAME的值
  • 创建数据卷
    docker volume create 数据卷名称

7. 常见问题

  • 拉去镜像超时(pull)
    • 一般是拉去最新版本,国外拉去缓慢。
    • 解决:换个低版本,再换国内镜像
      image
      image

8. 安装常用软件

8.1. mysql

docker run -d --name 容器名 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 镜像id前4位

8.2. nginx

容器内,默认配置文件地址
etc/nginx/conf.d/default.conf
需要手动修改配置文件,端口号才不是80
// 将文件从docker中拷贝到宿主机
docker cp nginx名称:/etc/nginx/default.conf /home/(宿主机文件目录)
// 改了配置文件后,拷回容器
docker cp /home/default.conf nginx:/etc/nginx/conf.d/

8.3. redis

亲测有效!
以华为云为例:详情见:https://www.cnblogs.com/123456QWErty/p/16548086.html

== 核心一步==

// --appendonly yes 代表用aof持久化
docker run -p 6379:6379 --name redis  -v /home/docker/redis/data:/data   -d --restart=always  redis:latest redis-server --appendonly yes --requirepass "micro2022@"

9. Dockerfile

  • 作用
    用来制作镜像的。

9.1. 语法

  • 固定第一行
    固定写FROM
  • 大小写
    不区分,但习惯为大写
  • 注释符号
    是 #

9.2. 命令

9.2.1. build 构建镜像

// . 代表执行此命令时,命令和Dockerfile在同一个目录
// -f 不是Dockerfile时需要传,Dockerfile可以不传
// -t 是tag的缩写,后面跟的是你取的镜像名
// 在当前目录找aa文件来执行
docker build . -f aa -t 容器名:版本号
// 在当前目录找Dockerfile文件
docker build . -t my_nginx:v2.0
关键字 作用 作用时机 说明
FROM 指定父镜像(在谁的基础上) docker build时 必须在第一行 基于哪个images构建
MAINTAINER 作者信息 docker build时 作者
LABEL 标签 docker build时 LABEL可以替代 MAINTAINER,最终都是在docker image基本信息中查看
RUN 执行命令 docker build时 执行一段命令,默认为/bin/sh 格式:RUN command或者RUN ["command","param1","param2"] ,多行RUN都会执行
CMD 容器启动命令(默认用/bin/sh) docker run时 启动容器时的默认命令和ENTRYPOINT配合使用,格式CMD command param1 param2 或者 CMD ["command","param1","param2"],docker run 命令带有命令的话也会覆盖CMD的内容, echo homehome变量的值,而 ["echo","home"]home字符串,dockerfile中多行cmd,只有最后一行会生效。
ENTRYPOINT 入口 docker run时 也有CMD的作用,可以执行命令,区别在于docker run 后面跟的指令,不能覆盖ENTRYPOINT的指令,意思ENTRYPOINT的内容一定会执行; 制作一些执行就关闭的容器中会用到 示例:ENTRYPOINT ["echo","hello"]
COPY 复制文件 docker build时 build时候复制文件到image中,可以将宿主机中的文件拷到镜像里面的目录去
ADD 添加文件(从宿主机或网上添加文件到镜像中) docker build时 build时候添加文件到image中,如果是宿主机上压缩包,会自动解压到镜像中,如果是通过网络url下载的压缩包,则不会解压,不仅仅局限于当前build上下文,可以来源于远程服务
ENV 环境变量 docker build时 指定build时的环境变量,可以在dokcer run时,通过-e覆盖。Dokcerfile 格式ENV name=value, 容器run时格式:-e name=rr888,进入容器执行env,是全局生效的,系统级的
ARG 构建参数 docker build时 只在构建时使用的参数,如果有ENV那ENV的相同名字值,始终覆盖arg参数(优先级,ENV>ARG)
VOLUME 定义外部可挂载的数据卷 docker build时 指定build的image那些目录可以启动时挂载到文件系统,启动容器时用-v绑定,格式 VOLUME["目录"] ,docker run -v 的优先级更高,会覆盖掉dockerfile里面的
EXPOSE 暴露端口 docker build时 容器运行的监听端口,启动容器使用-p绑定, 格式:EXPOSE 8080或者 EXPOSE 8080/udp,执行docker run -p命令时,优先级高于dockerfile的EXPOSE
WORKDIR 工作目录(可以有多个,会append追加路径) docker build时 有cd命令的效果,1:RUN pwd就会输出WORKDIR指定的目录;2:进入容器就会在WORKDIR指定的目录;指定容器内部工作目录,如没有创建则自动创建,如果指定/使用的是绝对地址,如果不是/开头,那么是在上一条 WORKDIR的相对路径
USER 指定执行用户 docker build时 指定build或启动时,用户在RUN CMD ENTRYPOINT执行的用户
HEALTHCHECK 健康检查 docker build时 指定监测当前容器的健康检测命令,基本没用,因为应用本身有健康检测机制
ONBUILD 触发器 docker build时 当存在ONBUILD关键字的镜像作为基础镜像时,当执行FROM完成之后,会执行ONBUILD命令,但不影响当前镜像
STOPSIGNAL 发送信号量到宿主机 docker build时 本指令设置将发送到容器的系统调用信号以退出
SHELL 指定执行脚本的shell docker build时 指定RUN CMD ENTRYPOINT 执行命令的时候使用的shell

9.3. 常见问题

  • RUN 中如何执行多条命令
    让命令在同一个shell中执行
    1:使用分号 (; 分隔命令:会在同一个 shell 中执行,示例:RUN pwd; ls; echo 666;
    2:逻辑与 (&&) 分隔命令,前面命令执行成功(即返回状态为 0)才会继续执行下一个,示例: RUN pwd && ls && echo 666
    3: 使用反斜杠 () 换行,可以在文件中换行,RUN pwd \
    && ls \
    && echo 666
    4: 执行sh脚本
    各命令相互独立,在不同shell执行:
    多行都以RUN开头。

10. 网络 network

10.1. 创建

// 默认为bridge模式
docker network create 网络名

10.2. 列表

// 查看所有网络, 默认启动的容器的网络是桥接,bridge
docker network ls

10.3. 加入网络

  • 创建容器时加入
    docker run --network 网络名 镜像名

  • 创建容器后加入
    // 追加,容器可以有多个网络
    docker network connect [选项]网络名 容器名或容器id

10.4. 查看

  • 查看网络详情
    // 可以查看该网络中有哪些容器
    docker network inspect 网络id

  • 查看容器的网络
    // 容器可以有多个网络
    docker inspect 容器id

10.5. 删除

docker network rm 网络id

11. docker-compose

11.1. 安装

  • 1:官网有介绍

  • 2:去github官方仓库,下载tgz离线安装。

  • 3:curl 一个国内镜像。

  • 安装成功,可以查看版本
    1: docker compose version // docker 自带的compose
    2: docker-compose version // 当都安装compose的版本

image

11.2. 命令

  • 构建镜像命令,build,示例: docker-compose build

  • 启动命令,up(包含了build),示例: docker-compose up

  • 查看运行的容器,ps,注意,需要在docker-compose.yml所在目录执行,示例:docker-compose ps

  • 停止,stop, 示例:docker-compose stop

  • 删掉所有容器,down,示例:docker-compose down

  • 进入容器,exec,示例:docker-compose 容器名 bash

11.3. yaml文件存放目录

一般在/root/docker-compose/具体应用目录

11.4. yaml 示例

# docker-compose.yaml
version: '2'
services:
# db service for zentao
  zentao-db:
    image: mariadb:10.6
    container_name: zentao-db
    ports:
      - '3306:3306'
    volumes:
      - /data/zentao/db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=pass4Zentao
      - MYSQL_DATABASE=zentao
    networks:
      - zentao-net
# zentao service
  zentao:
    image: hub.zentao.net/app/zentao
    container_name: zentao
    ports:
      - '80:80'
    volumes:
      - /data/zentao/file:/data
    depends_on:
      - zentao-db
    environment:
      - ZT_MYSQL_HOST=zentao-db
      - ZT_MYSQL_PORT=3306
      - ZT_MYSQL_USER=root
      - ZT_MYSQL_PASSWORD=pass4Zentao
      - ZT_MYSQL_DB=zentao
      - PHP_MAX_EXECUTION_TIME=120
      - PHP_MEMORY_LIMIT=512M
      - PHP_POST_MAX_SIZE=128M
      - PHP_UPLOAD_MAX_FILESIZE=128M
      - LDAP_ENABLED=false
      - SMTP_ENABLED=false
      - APP_DEFAULT_PORT=80
      - APP_DOMAIN=zentao.demo.com
      - PROTOCOL_TYPE=http
      - IS_CONTAINER=true
      - LINK_GIT=false
      - LINK_CI=false
    networks:
      # 指定用networks下的zentao-net
      - zentao-net
# 指定网络
networks:
  # 网络名
  zentao-net:
    # 驱动类型,桥接模式
    driver: bridge 

11.5. yaml关键词解读

  • networks,用于自定义网桥名 位与最顶级

  • web.build: .
    web是用于自己创建的app应用,并配合Dockerfile使用。
    build: 基于当前目录的Dockerfile构建镜像。

  • ports:
    前面是宿主机的,后面的是容器的。

  • volumes 有2种写法:
    宿主机目录挂载到容器,容器里面操作,等于操作宿主机的目录。
    1:一行,前面是宿主机,冒号后面为容器内部目录,示例:- /data/zentao/db:/var/lib/mysql

  • links(推荐使用depends_on):
    待废弃,因为:compose3,默认用自定义network driver,depends_on可以控制容器构建顺序,所以就把links替代了

作用1:jar包需要连redis,可以让redis先启动,在启动jar包。
作用2:springboot的yaml文件中redis的host地址,可以用docker-compose填的这个。
待亲测!
image

12. 项目部署

12.1. vue项目部署

  • 思路
    将打包的dist目录的所有内容,复制到nginx的html下

12.2. 所需镜像

  • mysql redis nginx jdk
  • springboot jar包
  • vue工程

13. 推送到阿里云私有仓库

13.1. 准备阿里云资料

  • 0 找到 容器镜像服务 / 实例列表 /镜像仓库
    创建命名空间
  • 1 阿里云私有仓库url
    可在【访问凭证】命令行查看
  • 2 账号
    可在【访问凭证】命令行查看
  • 3 密码
    可在【访问凭证】页面设置

13.2. 命令行操作

  • docker 登录
// 地址和账号可登录阿里云,在 容器镜像服务 / 实例列表 /访问凭证 查看
   docker login --username=账号 阿里云docker私有仓库地址
  • 本地镜像打标签
// jenkins:jdk17  jenkins=私有仓库的镜像名,jdk17=版本号
 docker tag 本地镜像id registry.cn-hangzhou.aliyuncs.com/命名空间/jenkins:jdk17
  • push 到私有镜像库
// 推送成功,默认为私有仓库
// jenkins:jdk17 是上面tag命令 对应的镜像名和版本号
docker push registry.cn-hangzhou.aliyuncs.com/命名空间/jenkins:jdk17

posted @   jf666new  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示