Docker官方文档学习笔记(三):总结与补充

举报
MAVER1CK 发表于 2023/03/04 19:01:30 2023/03/04
【摘要】 @[TOC]总结学习笔记(一)、学习笔记(二)中的内容菜鸟教程 配置 Docker DesktopDocker官方文档学习笔记(一):安装、升级、卸载Docker Dockerfile[菜鸟教程](https://www.runoob.com/docker/docker-dockerfile.html)# syntax=docker/dockerfile:1FROM node:12-alpi...

@[TOC]
总结学习笔记(一)、学习笔记(二)中的内容
菜鸟教程

配置 Docker Desktop

Docker官方文档学习笔记(一):安装、升级、卸载Docker

Dockerfile

[菜鸟教程](https://www.runoob.com/docker/docker-dockerfile.html)

# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

为docker pull设置代理

Docker daemon在它的启动环境中使用 HTTP_PROXY 、HTTPS_PROXY、NO_PROXY 环境变量配置 HTTP 或 HTTPS 代理行为,这些环境变量不能在 daemon.json 文件中配置,需要在Docker systemd 文件中添加配置

  1. 为docker服务创建systemd目录
sudo mkdir -p /etc/systemd/system/docker.service.d
  1. 创建一个名为 /etc/systemd/system/docker.service.d/http-proxy.conf 的文件并添加一个或多个环境变量
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

以下为示例内容

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:1080"
Environment="HTTPS_PROXY=http://127.0.0.1:1080"
Environment="NO_PROXY=localhost,127.0.0.1"
  1. 刷新更改并重新启动Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 验证是否加载成功
sudo systemctl show --property=Environment docker

docker run :从镜像新建容器并运行

docker run -d -p 80:80 getting-started

# docker run -dp 80:80 getting-started

-d :detach,后台运行

-p :端口映射,左边为容器的端口,右边为主机的端口

-v :挂载卷,格式为

命名卷名称:容器文件夹路径

主机文件夹路径:容器文件夹路径

--network 网络名称 :指定容器使用的网络。在同一网络下的容器可以互相通信

-e :用于设定环境变量,格式为

-e 变量名=

每次执行的时候都会创建一个新容器,若要启动先前的容器,使用 docker start 命令

若镜像不存在,则会下载,可以设置代理,与build命令设置方法不同,在DashBoard中设置代理即可,并且可以使用127.0.0.1作为代理地址

docker start :运行已创建的容器

docker start 容器ID或名称

docker build :构建镜像

docker build -t getting-started .

-t 指定镜像名称
. 声明Dockerfile路径,一般为项目根目录

设置代理

  • 三种方法

    • 方法一:在运行命令的时候添加参数(不能为127.0.0.1,因为docker会使用自己创建的网卡,所以需要将代理地址改为本机ip,然后在代理软件里设置监听地址为0.0.0.0,Ubuntu软件商店的Electron不能设置监听地址,可以使用商店里的Qv2ray):
    --build-arg http_proxy=http://192.168.66.23:1080 --build-arg https_proxy=http://192.168.66.23:1080
    
    • 方法二:在~/.docker/config.json中添加
    "proxies": {
    	"default": {
    		"httpProxy": "http://192.168.66.23:1080",
    		"httpsProxy": "http://192.168.66.23:1080",
    		"noProxy": "localhost"
    	}
    },
    

    如图所示
    在这里插入图片描述
    运行的时候不需要加参数,docker会自动配置容器的代理,但是对于已有的容器无效,对新容器有效,所以要么重新创建容器,要么在容器内通过修改bashrc等方式设置旧容器的代理,bashrc和json中的代理地址都可以使用127.0.0.1

    • 方法三:
      方法一适用于docker build命令,若docker run命令下载镜像时,在Docker Desktop的设置中设置代理即可
      在这里插入图片描述

换源

参考菜鸟教程,推荐使用阿里云。
若不使用自定义源,必须删除配置文件,否则会导致docker服务启动失败

docker ps :查看正在运行的容器

docker ps

加上参数 -a 即可看到所有容器,等价于

docker container ls

在这里插入图片描述

docker stop :停止容器

docker stop 容器ID或名称

docker rm :删除容器

docker rm 容器ID或名称

删除前需要使用 docker stop 停止容器

docker stop 容器ID或名称

但加上参数 -f 即可不需要停止容器强制删除它

docker container commit :打包容器

容器打包成新的镜像

docker container commit --author=作者信息 --message=提交说明 要打包的容器的名称 打包生成的镜像的名称:标签

docker commit :打包容器/镜像

与 docker container commit 作用相同,都是将容器打包成新的镜像

docker commit --author=作者信息 --message=提交说明 要打包的容器的名称 打包生成的镜像的名称:标签

docker export :导出容器

将容器导出为tar文件

docker export -o 文件名.tar 容器名

docker import :导入镜像

将 docker export 导出的tar文件导入,导入后会成为一个镜像

docker import 文件名.tar 镜像名

docker save :导出镜像

将打包的镜像导出为tar文件

docker save -o 文件名.tar 镜像名:标签

docker load :导入镜像

将 docker save 导出的tar文件导入

docker load -i 文件名.tar

docker logs :查看日志

docker logs 容器ID或名称

加上 -f 参数可以实时更新日志

Docker Hub

初始化用户

  1. 生成gpg密钥
    gpg --generate-key
    
    生成后将输出内容中的pub部分复制
  2. 初始化pass
    pass init 刚才复制的pub部分
    
  3. 登录Docker Desktop或使用docker login命令登录即可,使用docker hub生成的访问令牌登录时,注意保管好令牌,因为生成之后只在生成完成的时候显示一次,登录的时候将输入的密码改为输入生成的令牌即可

若要删除密钥,需要删除公钥和私钥

# 删除私钥
gpg --delete-secret-keys 私钥

# 删除公钥
gpg --delete-keys 公钥

若要删除pass中的密码信息

pass rm gpg生成密钥时使用的邮箱

docker login :登录Docker Hub

docker login -u 用户名

可以在Docker Hhub中生成访问令牌替代输入密码,只在生成的时候显示一次,登陆成功后会将用户名和密码使用base64加密存储在 ~/.docker/config.json 的 auth 中,使用base64解密即可看到用户名和访问令牌的明文

echo -n "auth中的base64加密数据" | base64 -d

仓库

创建仓库

  1. 登录Docker Hub
  2. 点击创建仓库按钮“Create a Repository”
    在这里插入图片描述

docker tag :重命名镜像

docker tag 镜像名 用户名/镜像名(即仓库名)

docker push : 推送镜像

docker push 用户名/镜像名(即仓库名)

docker exec :在自己的终端中向容器发送要执行的命令

docker exec 容器ID或名称 要执行的命令

docker network :容器网络

创建网络

docker network create 网络名称

在 docker run 的时候使用

--network 网络名称

即可指定容器使用的网络。在同一网络下的容器可以互相通信

命名卷(named volume)

命名卷在主机中的存储位置由Docker决定

docker volume create :创建命名卷

docker volume create 卷名称

可在 docker run 中使用

-v 命名卷名称:容器文件夹路径

参数绑定

docker volume inspect :查看卷

docker volume inspect 卷名称

查看命名卷的详细信息

绑定挂载(bind mounts)

可将主机中具体的某个目录与容器中的某个目录绑定,可在 docker run 中使用

-v 主机文件夹路径:容器文件夹路径

绑定

Docker Compose

docker compose logs :查看容器组日志

docker compose logs

加上 -f 参数可以实时更新日志

命令末尾可以加上特定服务名称以单独查看它的日志

docker-compose.yml

version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

init

在服务中添加参数

init: true

可避免docker内产生僵尸进程,因为PID为1的进程会改为docker提供的init进程,该进程会杀死僵尸进程

例如上方的yml文件添加init参数后变为

version: "3.7"

services:
  app:
  	init: true
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

docker compose down :删除容器组(包含其中的容器)和网络

使用 docker compose down 命令或点击 Docker Dashboard 中分组栏的垃圾桶图标来删除,默认情况下两种方式都不会删除创建的卷,如果需要删除相应的卷,在命令后加上 --volumes 参数或点击 Docker Dashboard 的 Volumes 栏找到卷并删除
在这里插入图片描述

以非root用户身份管理Docker

Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户所有root,其他用户只能使用sudo。Docker 守护程序始终以root用户身份运行。

如果您不想在docker命令前加上sudo,请创建一个名为 docker 的Unix组并将用户添加到其中。当 Docker 守护进程启动时,它会创建一个可供docker组成员访问的 Unix 套接字。

该docker组授予与root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅Docker Daemon Attack Surface

  1. 创建 docker 组
sudo groupadd docker
  1. 将用户添加到 docker 组中
sudo usermod -aG docker $USER
  1. 注销并重新登录
  2. 验证是否可以不使用 sudo 运行docker
docker run hello-world

若报下方的错误

WARNING: Error loading config file: /home/user/.docker/config.json
stat /home/user/.docker/config.json: permission denied

则修改权限

sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R

将 Docker 配置为开机启动

在 Debian 和 Ubuntu 上,Docker 服务默认配置为开机自启。

若需要设置为开机自启,使用以下命令

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

若禁用开机自启,则

sudo systemctl disable docker.service
sudo systemctl disable containerd.service

为Docker指定DNS服务器

  1. 编辑 /etc/docker/daemon.json
sudo vim /etc/docker/daemon.json
  1. 添加地址
"dns": ["8.8.8.8", "8.8.4.4"]
  1. 重启守护程序
sudo service docker restart

使用 systemd 控制 Docker

启动Docker守护进程(Docker daemon)

sudo systemctl start docker

为Docker设置HTTP/HTTPS代理

Docker daemon在它的启动环境中使用 HTTP_PROXY 、HTTPS_PROXY、NO_PROXY 环境变量配置 HTTP 或 HTTPS 代理行为,这些环境变量不能在 daemon.json 文件中配置,需要在Docker systemd 文件中添加配置

  1. 为docker服务创建systemd目录
sudo mkdir -p /etc/systemd/system/docker.service.d
  1. 创建一个名为 /etc/systemd/system/docker.service.d/http-proxy.conf 的文件并添加一个或多个环境变量
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

以下为示例内容

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:1080"
Environment="HTTPS_PROXY=http://127.0.0.1:1080"
Environment="NO_PROXY=localhost,127.0.0.1"
  1. 刷新更改并重新启动Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
  1. 验证是否加载成功
sudo systemctl show --property=Environment docker

端口映射

docker-compose.yml写法,以映射容器ssh的22端口为例

ports:
  - "2222:22"

根据官方文档说明,在host模式下,端口映射不可用,因此修改 /etc/ssh/sshd_config 中的 Port ,改为2222,然后地址使用 localhost 即可连接容器,若要允许root用户登陆,将 PermitRootLogin 的值改为 yes 。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。