Docker官方文档学习笔记(一):安装、升级、卸载Docker
[菜鸟教程](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 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 容器ID或名称
docker build -t getting-started .
-t 指定镜像名称
. 声明Dockerfile路径,一般为项目根目录
三种方法
--build-arg http_proxy=http://192.168.66.23:1080 --build-arg https_proxy=http://192.168.66.23:1080
"proxies": {
"default": {
"httpProxy": "http://192.168.66.23:1080",
"httpsProxy": "http://192.168.66.23:1080",
"noProxy": "localhost"
}
},
参考菜鸟教程,推荐使用阿里云。
若不使用自定义源,必须删除配置文件,否则会导致docker服务启动失败
docker ps
加上参数 -a 即可看到所有容器,等价于
docker container ls
docker stop 容器ID或名称
docker rm 容器ID或名称
删除前需要使用 docker stop 停止容器
docker stop 容器ID或名称
但加上参数 -f 即可不需要停止容器强制删除它
将容器打包成新的镜像
docker container commit --author=作者信息 --message=提交说明 要打包的容器的名称 打包生成的镜像的名称:标签
与 docker container commit 作用相同,都是将容器打包成新的镜像
docker commit --author=作者信息 --message=提交说明 要打包的容器的名称 打包生成的镜像的名称:标签
将容器导出为tar文件
docker export -o 文件名.tar 容器名
将 docker export 导出的tar文件导入,导入后会成为一个镜像
docker import 文件名.tar 容器名
将打包的镜像导出为tar文件
docker save -o 文件名.tar 镜像名:标签
将 docker save 导出的tar文件导入
docker load -i 文件名.tar
docker logs 容器ID或名称
加上 -f 参数可以实时更新日志
gpg --generate-key
生成后将输出内容中的pub部分复制pass init 刚才复制的pub部分
若要删除密钥,需要删除公钥和私钥
# 删除私钥
gpg --delete-secret-keys 私钥
# 删除公钥
gpg --delete-keys 公钥
若要删除pass中的密码信息
pass rm gpg生成密钥时使用的邮箱
docker login -u 用户名
可以在Docker Hhub中生成访问令牌替代输入密码,只在生成的时候显示一次,登陆成功后会将用户名和密码使用base64加密存储在 ~/.docker/config.json 的 auth 中,使用base64解密即可看到用户名和访问令牌的明文
echo -n "auth中的base64加密数据" | base64 -d
docker tag 镜像名 用户名/镜像名(即仓库名)
docker push 用户名/镜像名(即仓库名)
docker exec 容器ID或名称 要执行的命令
创建网络
docker network create 网络名称
在 docker run 的时候使用
--network 网络名称
即可指定容器使用的网络。在同一网络下的容器可以互相通信
命名卷在主机中的存储位置由Docker决定
docker volume create 卷名称
可在 docker run 中使用
-v 命名卷名称:容器文件夹路径
参数绑定
docker volume inspect 卷名称
查看命名卷的详细信息
可将主机中具体的某个目录与容器中的某个目录绑定,可在 docker run 中使用
-v 主机文件夹路径:容器文件夹路径
绑定
docker compose logs
加上 -f 参数可以实时更新日志
命令末尾可以加上特定服务名称以单独查看它的日志
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:
使用 docker compose down 命令或点击 Docker Dashboard 中分组栏的垃圾桶图标来删除,默认情况下两种方式都不会删除创建的卷,如果需要删除相应的卷,在命令后加上 --volumes 参数或点击 Docker Dashboard 的 Volumes 栏找到卷并删除
Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户所有root,其他用户只能使用sudo。Docker 守护程序始终以root用户身份运行。
如果您不想在docker命令前加上sudo,请创建一个名为 docker 的Unix组并将用户添加到其中。当 Docker 守护进程启动时,它会创建一个可供docker组成员访问的 Unix 套接字。
该docker组授予与root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅Docker Daemon Attack Surface。
sudo groupadd docker
sudo usermod -aG docker $USER
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
在 Debian 和 Ubuntu 上,Docker 服务默认配置为开机自启。
若需要设置为开机自启,使用以下命令
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
若禁用开机自启,则
sudo systemctl disable docker.service
sudo systemctl disable containerd.service
sudo vim /etc/docker/daemon.json
"dns": ["8.8.8.8", "8.8.4.4"]
sudo service docker restart
sudo systemctl start docker
Docker daemon在它的启动环境中使用 HTTP_PROXY 、HTTPS_PROXY、NO_PROXY 环境变量配置 HTTP 或 HTTPS 代理行为,这些环境变量不能在 daemon.json 文件中配置,需要在Docker systemd 文件中添加配置
sudo mkdir -p /etc/systemd/system/docker.service.d
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"
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl show --property=Environment docker