唠唠闲话

参考链接:菜鸟教程B站视频

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。


Docker 安装(Ubuntu 系统)

  1. 下载并执行脚本

    1
    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

    或者使用 daocloud 脚本

    1
    curl -sSL https://get.daocloud.io/docker | sh

    安装需等待较长时间

  2. 安装完成后,显示页面如下
    20220704153521

基本使用

  1. 帮助启动类命令
    • 启动 Docker systemctl start docker
    • 停止 Docker systemctl stop docker
    • 重启 Docker systemctl restart docker
    • 查看状态 systemctl status docker
    • 开机启动 systemctl enalbe docker
    • 查看概要 docker info

Docker 的三个重要概念,容器,镜像和定制镜像文件。

镜像基础

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所拥有内容。

  1. 查看本地镜像 docker images
    20220704154909

  2. 搜索镜像 docker search

    • --limit int 设定搜索数目
  3. 拉取镜像 docker pull

    1
    2
    3
    4
    # 下载 nginx 镜像
    docker pull nginx
    # 下载 ubuntu 镜像
    docker pull ubuntu

    默认下载最新版本,如果需要指定版本,可以使用 docker pull <镜像名>:<tag>

  4. 删除镜像 docker rmi <镜像名>;若存在镜像对应的容器,则需通过 -f 参数强制删除

容器

容器是真正干活的对象。

  1. 创建容器 docker run 是启动交互式容器命令

    • --name <名称> 指定名称,默认使用随机名称
    • -d 后台运行容器
    • -i interact 交互模式启动,通常与 -t 参数一并使用
    • -t terminal 为容器分配伪输入终端
    • -P 随机端口映射
    • -p 指定端口映射,比如 -p 2333:23 将外部 2333 端口映射到容器 23 端口
    • -v 挂载文件系统,比如 -v <主机路径>:<容器路径>
  2. 容器创建示例

    1
    docker run --name rexwzh -it ubuntu /bin/bash

    以交互模式启动一个容器,并在容器内执行 /bin/bash 操作。注意如果使用 exit 退出,则容器关闭,而使用 ctrl+p+q 退出,则容器保持运行
    注:也可以使用 create 命令,创建但不启动

  3. 查看当前容器 docker ps
    -a 将已经关闭的容器一并显示
    -l 显示最近创建的容器
    -n 显示最近创建的 n 个容器

  4. 启用和停止容器 docker stop/start <容器ID/名字>

    1
    2
    3
    4
    5
    6
    # 关闭 nginx 容器
    docker stop 990 # 输入 ID 前几位即可
    # 重新启动 nginx 容器
    docker start 990
    # 停止所有容器
    docker stop $(docker ps -a -q)
  5. 删除容器 docker rm <容器id>

    • 如果容器正在启用,删除需使用 -f 参数
    • docker rm -f $(docker ps -a -q) 删除所有容器
  6. 进入已启动的容器

    • docker exec -it <容器ID> /bin/bash
    • docker attach -it <容器ID> 这种方式用 exit 退出后会导致容器停止,因而较少用到
  7. 查看容器变化 docker diff <容器>,这里应该是相对于镜像的变化

  8. 容器管理

    • 容器文件备份 docker ps <容器ID>:<文件路径> <目标路径>
    • 容器快照导出 docker export 容器ID > 备份文件.tar
    • 容器快照导入 cat 备份文件.tar | docker import - <镜像名/镜像名:版本>

镜像进阶

docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。Docker 镜像层都是只读的,当容器启动时,一个新的可写层会加载到镜像的顶部,作为容器层。

将容器保存为镜像 docker commit <容器> <镜像名>:<版本号>

  • -m <提交信息> 提交信息,参数可选
  • 版本号可省略,默认为 latest
  • commit 命令保存的镜像,由于增加了可写层,因此体积会比原镜像大,不推荐使用
  • 保存镜像 docker save <镜像名> > <文件名>
  • 导入镜像 docker load <文件名>
  • 将容器保存为镜像,docker commit <容器名>

远程访问

  1. Docker Hub 注册账号

  2. 选择创建仓库,比如 rexwzh/helloworld
    20221105222136
    Docker 免费用户只能创建一个私有仓库(公开仓库规则暂时不清楚)

    Docker Registry 用于搭建本地的镜像仓库。

  3. 构建镜像,编写 Dockerfile 后,执行

    1
    docker build -t <镜像名>:<版本号> .
  4. 发布到 Docker Hub

    • docker login 登录
    • docker push <镜像名> 发布
    • docker pull <镜像名> 拉取

ssh 连接

参考链接: CSDN

容器设置

  1. 创建容器,比如

    1
    docker run -it --name mydocker -p 2333:2333 -v /home/rex/mydocker:/root/workspace ubuntu:latest

    参数说明:

    • --name 容器名称
    • -p 2333:2333 容器端口映射,左边为外部访问端口,右边为宿主机的端口,可指定多个
    • -v 外部路径:容器路径 将外部路径挂载到容器中
  2. 进入容器

    1
    docker exec -it mydocker /bin/bash
  3. 更新软件,安装 ssh 工具,并设置密码

    1
    2
    3
    apt-get update
    apt-get install openssh-server
    passwd
  4. 修改 ssh 配置文件

    1
    vim /etc/ssh/sshd_config

    修改内容:

    • PremitRootLogin 参数改为 PremitRootLogin yes
    • Port 22 改为容器端口,比如这里是 Port 2333
  5. 重启 ssh 服务

    1
    service ssh restart
  6. 输入 ssh root@[IP 地址] -p 2333 进行测试,这里 2333 为容器设置的端口号

SSH 免密设置

  1. 新建本地 ssh 密钥,比如

    1
    ssh-keygen -t rsa -C "youxiang@qq.com" -f ~/.ssh/xxx_rsa
  2. 将本地密钥添加到容器中,比如

    1
    ssh-copy-id -p 2333 -i ~/.ssh/xxx_rsa root@[IP 地址]

    如果设置了过多密钥,提示验证错误,则增加 -o 参数

    1
    ssh-copy-id -p 2333 -i ~/.ssh/xxx_rsa root@[IP 地址] -o PubkeyAuthentication=no
  3. 配置本地密钥文件

    1
    2
    3
    4
    5
    6
    7
    vim ~/.ssh/config
    ## 增加一条规则
    Host [IP 地址简写]
    HostName [IP 地址]
    User root
    Port 2333
    IdentityFile ~/.ssh/xxx_rsa

    之后输入 ssh <Host 内容> 就能访问容器了

注:如果 ssh 访问容器提示 refused,可能端口没修改,或者容器被关闭,尝试重新进入容器并执行 server ssh restart

其他

添加用户组,允许用户组使用 docker 命令

1
2
3
4
5
6
## 添加组
sudo groupadd docker
## 添加用户到组
sudo usermod -aG docker $USER
## 查看 docker 组中的用户
sudo cat /etc/group | grep docker