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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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会自动配置容器的代理

- 方法三:

方法一适用于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 。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
Kubernetes Ubuntu Linux
docker学习笔记
docker学习笔记
59 0
|
2月前
|
安全 网络安全 开发者
Docker学习笔记(一):Docker命令总结
本文介绍了Docker的基本概念、优点以及常用命令。Docker是一个开源的应用容器引擎,它通过容器打包应用程序及其依赖项,实现快速部署和迁移。主要优点包括轻量级、可移植性、易于管理、安全性和开源性。文章还区分了镜像和容器的概念,并提供了构建镜像、查看容器、运行容器、停止和删除容器等常用Docker命令的示例。
164 0
|
3月前
|
Docker Windows Python
Windows-Docker学习笔记(一)
本文介绍了Windows环境下Docker的安装与使用方法。首先通过链接下载Windows版本的Docker,然后按步骤配置:启用Windows功能、设置默认WSL版本为2,并检查Docker及其组件是否正常工作。接着详细列出了Docker的基础命令及其用法,包括搜索、下载镜像、管理容器等。同时介绍了Dockerfile的编写方法及其构建过程,以及docker-compose.yml文件的用途。最后提供了运行和管理容器的具体示例。
Windows-Docker学习笔记(一)
|
4月前
|
关系型数据库 MySQL 数据安全/隐私保护
使用 Docker 部署一个文档管理系统,让宝贵文档不在丢失!
使用 Docker 部署一个文档管理系统,让宝贵文档不在丢失!
|
4月前
|
前端开发 jenkins 持续交付
jenkins学习笔记之二十:docker in docker运行pipeline
jenkins学习笔记之二十:docker in docker运行pipeline
|
4月前
|
jenkins Java 持续交付
jenkins学习笔记之十九:Docker安装jenkins master及动、静态配置slave
jenkins学习笔记之十九:Docker安装jenkins master及动、静态配置slave
|
6月前
|
Docker 容器
如何使用Docker部署WPS Office服务并实现无公网IP远程处理文档表格(二)
使用Docker部署的WPS Office服务可以通过内网穿透工具Cpolar实现远程访问。首先,创建一个名为“wps office”的隧道,选择HTTP协议和3000端口,分配免费的随机域名,并指定中国地区。然后,通过Cpolar的管理界面获取HTTP公网地址,用以远程访问WPS Office。由于随机域名会变化,可以升级Cpolar套餐并保留一个二级子域名,确保长期稳定的远程访问。配置子域名后,更新隧道设置,完成固定公网地址的绑定,从而实现随时随地通过固定地址访问WPS Office。
|
6月前
|
NoSQL Redis Docker
使用 Docker Compose 接管现有容器的文档
使用 Docker Compose 接管现有容器的文档
100 2
|
7月前
|
安全 Linux Docker
Ubantu docker学习笔记(六)容器数据卷
Ubantu docker学习笔记(六)容器数据卷
Ubantu docker学习笔记(六)容器数据卷
|
6月前
|
安全 Linux 网络安全
如何使用Docker部署WPS Office服务并实现无公网IP远程处理文档表格(一)
在群晖NAS上使用Docker部署WPS Office并结合Cpolar内网穿透的步骤包括: 1. 通过SSH命令行拉取`linuxserver/wps-office`镜像。 2. 在群晖容器管理界面运行镜像,设置启动选项和端口映射。 3. 本地访问群晖IP:3000端口以使用WPS Office。 4. 安装Cpolar套件,手动添加并安装到群晖,通过9200端口访问其Web管理界面。 5. 使用Cpolar配置内网穿透,实现远程访问WPS Office。 这一过程允许用户即使在没有公网IP的情况下,也能通过Cpolar将内网的WPS Office服务暴露到公网,便于远程办公和文档处理。

热门文章

最新文章