总结学习笔记(一)、学习笔记(二)中的内容
菜鸟教程
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 文件中添加配置
- 为docker服务创建systemd目录
sudo mkdir -p /etc/systemd/system/docker.service.d
- 创建一个名为 /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"
- 刷新更改并重新启动Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
- 验证是否加载成功
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
初始化用户
生成gpg密钥
gpg --generate-key
生成后将输出内容中的pub部分复制
初始化pass
pass init 刚才复制的pub部分
- 登录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
仓库
创建仓库
- 登录Docker Hub
- 点击创建仓库按钮“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。
- 创建 docker 组
sudo groupadd docker
- 将用户添加到 docker 组中
sudo usermod -aG docker $USER
- 注销并重新登录
- 验证是否可以不使用 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服务器
- 编辑 /etc/docker/daemon.json
sudo vim /etc/docker/daemon.json
- 添加地址
"dns": ["8.8.8.8", "8.8.4.4"]
- 重启守护程序
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 文件中添加配置
- 为docker服务创建systemd目录
sudo mkdir -p /etc/systemd/system/docker.service.d
- 创建一个名为 /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"
- 刷新更改并重新启动Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
- 验证是否加载成功
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 。