Docker

docker外的基本操作

1
systemctl [参数] docker
1
2
3
4
5
6
7
systemctl start docker 启动

systemctl  restart docker 重启

systemctl  stop docker 停止

systemctl  status docker 查看状态

docker基本目录

/etc/docker/				# docker的认证目录
/var/lib/docker/			# docker的应用目录

docker中的常用命令

镜像与容器类似于 类型和变量的关系

镜像(image)

搜索镜像

1
docker search [镜像名称r hub中搜索 ...的镜像

下载镜像

1
docker pull [镜像名称]:[镜像版本]	## 不写版本省略':'默认下载最新版(latest)

查看本地镜像

1
2
3
docker images 			## 查看本地镜像,,下载的镜像保存在"/var/lib/docker/image/overlay2/repositories.json"中
docker image ls			## 查看本地镜像,功能和上面的完全一样
docker images [镜像名称] ## 指定名字查看本地镜像,docker image ls同理

查询结果包括:

  • REPOSITORY: 镜像名称
  • TAG: 镜像版本
  • IMAGE ID: 镜像id
  • CREATED: 镜像的创建时间
  • SIZE: 镜像的大小

重命名镜像

1
docker tag [原镜像名称:原镜像版本] [新镜像名称:新镜像版本]	## 拷贝并重命名,拷贝出来的镜像 id不变,还是指向同一个镜像

删除镜像

1
2
3
## "docker rmi"等价于"docker image rm"
docker rmi [命令参数] [镜像id]			## 可以以空格分隔写多个id同时删除多个镜像
docker rmi [命令参数] [镜像名称:镜像版本]

命令参数包括:

  • -f : 强制删除
  • –no-prune : 不移除该镜像的过程镜像,默认移除

保存镜像

1
docker save [-o,输出到的文件][导出镜像压缩文件的名称][本地镜像]	## 将镜像保存在本地
1
docker save -o myUbuntu.tar ubuntu					## 把ubuntu 保存为myUbuntu.tar

导入镜像

1
2
docker load [命令参数][被导入镜像压缩文件的名称...]
docker load < [被导入镜像压缩文件的名称...]

命令参数包括:

  • -i,–input 指定交互模式 : 指定导入的文件,不指定默认 STDIN
  • -q,–quiet : 精简输出信息

查看镜像历史

1
docker history [命令参数] [镜像名称]

命令参数包括:

  • **-H :**以可读的格式打印镜像大小和日期,默认为true
  • **–no-trunc :**显示完整的提交记录
  • **-q :**仅列出提交记录ID

根据模板创建镜像

模板网站 https://download.openvz.org/template/precreated/

cat 模板文件名.tar | docker import - [自定义镜像名]

容器(container)

启动/关闭/终止/重启容器

1
docker start [命令参数] [容器名称或容器id]
1
2
docker stop [容器名称或容器id]		## 关闭容器
docker kill [容器名称或容器id]		## 强行终止容器
1
docker restart [容器名称或容器id]

命令参数包括:

  • -a,–attach :在前台运行容器并输出日志
  • -i,–interaction :启动并进入交互模式

查看本地容器

1
docker ps [命令参数]

命令参数包括:

  • **-a :**显示所有的容器,包括未运行的
  • **-f :**根据条件过滤显示的内容
  • **–format :**指定返回值的模板文件
  • **-l :**显示最近创建的容器
  • **-n :**列出最近创建的n个容器
  • **–no-trunc :**不截断输出
  • **-q :**静默模式,只返回容器id,常用于其他命令中 docker rm -f $(docker ps -a -q) 强制删除所有容器
  • **-s :**显示总的文件大小

查询结果包括:

  • CONTAINER ID: 容器 ID。
  • IMAGE: 使用的镜像。
  • COMMAND: 启动容器时运行的命令
  • CREATED: 容器的创建时间
  • STATUS: 容器状态

容器状态(STATUS)有7种:

  • created(已创建)
  • restarting(重启中)
  • running 或 Up(运行中)
  • removing(迁移中)
  • paused(暂停)
  • exited(停止)
  • dead(死亡)

创建容器

创建但不启动
1
docker create [命令参数] 创建依赖的镜像 [容器内命令] [命令参数...]
创建并启动
docker run [命令参数] 创建依赖的镜像 [容器内命令] [命令参数...]

命令参数包括:

  • -a stdin : 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
  • -d : 后台运行容器,并返回容器ID
  • -i : 以交互模式运行容器,通常与 -t 同时使用,简写成 -it ,即创建虚拟输入终端并保持输入
  • -P : 随机端口映射,容器内部端口随机映射到主机的端口
  • -p : 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用
  • –name=“nginx-lb” : 为容器指定一个名称为 nginx-lb ,不指定则直接生成一个随机 string
  • –dns 8.8.8.8 : 指定容器使用的DNS服务器,默认和宿主一致
  • –dns-search example.com : 指定容器DNS搜索域名,默认和宿主一致
  • -h “mars” : 指定容器的hostname
  • -e username=“ritchie” : 设置环境变量
  • –env-file=[] : 从指定文件读入环境变量
  • –cpuset=“0-2” or –cpuset=“0,1,2” : 绑定容器到指定CPU运行
  • -m :设置容器使用内存最大值
  • –net=“bridge” : 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
  • –link=[] : 添加链接到另一个容器
  • –expose=[] : 开放一个端口或一组端口
  • –volume , -v : 绑定一个卷
  • –rm :在容器退出时就能够自动清理容器内部的文件系统,等价于在容器退出后,执行 docker rm -v,在测试时 容器内数据不需要保存可以使用此参数

容器内命令指 ps\ls 等命令,在容器启动后执行

命令参数则是 -a 之类的

暂停容器

1
docker pause [容器名称或容器id]
1
docker unpause [容器名称或容器id]

删除容器

1
docker rm [命令参数] [容器名称或容器id]

命令参数包括:

  • -f :通过 SIGKILL 信号强制删除容器
  • **-l :**移除容器间的网络连接,而非容器本身
  • **-v :**并删除与容器关联的卷

进入容器

在创建时进入
1
2
3
docker run -it 依赖镜像 /bin/bash
## -it 以前台输入模式创建虚拟终端 详见 创建容器的命令参数说明 
## /bin/bash 启动后运行 /bin/bash启动镜像中的终端
进入后台容器
1
docker exec [命令参数] [容器id或名称] /bin/bash

命令参数包括:

  • **-d :**分离模式: 在后台运行
  • **-i :**即使没有附加也保持STDIN打开
  • **-t :**分配一个伪终端
启动容器时进入
使用命令进入
1
docker start -i [容器名称或容器id]
使用脚本进入

创建docker_in.sh脚本

1
2
3
4
5
6
7
8
#!/bin/bash
# Use nsenter to access docker
docker_in(){
   NAME_ID=$1
   PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
   nsenter -t $PID -m -u -i -n -p
}
docker_in $1

调用脚本+容器名

如:./docker_in.sh myNginx

退出容器

Ctrl+D或输入exit

docker update(容器参数更新)

docker update | Docker Documentation

1
docker update [OPTIONS] CONTAINER [CONTAINER...]

命令参数:

Name, shorthand Default Description
--blkio-weight Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--cpu-period Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period Limit the CPU real-time period in microseconds
--cpu-rt-runtime Limit the CPU real-time runtime in microseconds
--cpu-shares , -c 1024 CPU资源权重,默认1024
--cpus Number of CPUs
--cpuset-cpus CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems MEMs in which to allow execution (0-3, 0,1)
--memory , -m 内存
--memory-reservation Memory soft limit
--memory-swap Swap limit equal to memory plus swap: -1 to enable unlimited swap
--pids-limit API 1.40+ Tune container pids limit (set -1 for unlimited)
--restart no 容器自启动策略(可选参数: no / on-failure / always / unless-stopped)

–cpu-shares:

​ cpu权重(Default:1024) 即在cpu资源不足时的分配权重 比如 有四个容器 它们的cpu-shares被设置为 1024\512\2048\1024 那么CPU资源比例变为2:1:4:2

–restart的参数解释:

​ no: 不自动重启容器

​ on-failure: 在容器非正常退出时(退出状态非0),才会重启容器,后面可以加参数表示最多重启次数,比如:on-failure:3

​ always: 在容器退出时总是重启容器

​ unless-stopped: 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

例子:

将abebf7571666 hopeful_morse两个容器 设置 cpu权重为512 内存为300M

1
docker update --cpu-shares 512 -m 300M abebf7571666 hopeful_morse

容器日志

1
docker logs [命令参数] [容器名称或id]

命令参数包括:

  • -f : 跟踪日志输出
  • **–since :**显示某个开始时间的所有日志
  • -t : 显示时间戳
  • **–tail :**仅列出最新N条容器日志

容器重命名

1
docker rename [原名称或id] [新名称]

查看容器端口

1
docker port [容器id或者名称]

获取镜像/容器的详细信息

1
docker inspect [命令参数] [镜像/容器名称...]

命令参数包括:

  • **-f :**指定返回值的模板文件
  • **-s :**显示总的文件大小
  • **–type :**指定对象类型为:镜像,容器,数据卷等

根据容器创建镜像

1
docker commit [命令参数] [容器名称] [镜像名称:镜像版本]

命令参数包括:

  • **-a :**提交的镜像作者;
  • **-c :**使用Dockerfile指令来创建镜像;
  • **-m :**提交时的说明文字;
  • **-p :**在commit时,将容器暂停。

export 归档 直接打包到当前目录

1
docker export -o myubuntu-`date +%Y%m%d` myUbuntu

数据卷

文件/文件夹 在容器中和宿主机的映射

创建容器时绑定数据卷

1
docker run -itd --name [容器名称名称] -v [宿主机路径]:[虚拟机路径] [创建容器的镜像名]

关于docker desttop的宿主机路径:

因为 wsl没有使用win原本的路径而是虚拟机的路径 所以可能会映射不到

需要在 /mnt/目录下映射 其目录下的 c\d\wsl 等分别对应 win的c盘、d盘和wsl虚拟机的路径

例:

1
docker run -itd --name testTmp3 -v /mnt/d/testVolume/:/tmp/ nginx

数据卷容器

作为数据卷的容器可以哪怕在不启动的状态下被多个容器共享

创建被数据卷容器

1
2
3
docker create -v [共享目录] [命令参数...] [镜像名称]
例如:
docker create -v /data-tmp --name v-tmp nginx

创建使用数据卷的容器

1
2
3
4
docker run --volumes-from [数据卷容器] [命令参数...] [镜像名称]
例如:
docker run --volumes-from v-tmp --name tmp01 -itd nginx
docker run --volumes-from v-tmp --name tmp02 -itd nginx

此时使用了数据卷 v-tmp 的 tmp01 和 tmp02就可以共享 /data-tmp文件夹

基于数据卷容器备份
1
docker run --volumes-from v-tmp -v /mnt/d/docker/backup:/backup --name tmp03 -itd nginx tar cvf /backup/backup.tar /data-tmp

命令解释

这是两个命令的合并

到nginx之前:创建容器 tmp03 挂载 v-tmp 并建立容器内/backup和本地文件夹的映射

从tar开始:打包数据卷容器v-tmp共享目录 /data-tmp 到本地目录映射的/backup

完成将 /data-tmp 备份到本地的 /backup目录

dockerfile

基于镜像创建自己的镜像的脚本

官方文档中文版

菜鸟dockerfile

Shell格式和Exec格式

1
2
3
4
Shell 格式
	run apt-get install -y vim
	cmd echo "hello world"
	entrypoint echo "hello world"
1
2
3
4
Exec 格式
	run ["apt-get","install","-y","vim"]
	cmd ["/bin/echo","hello world"]
	entrypoint ["/bin/echo","hello world"]

Exec 更类似于函数 以string

常用指令

配置指令

FROM:基于xxx镜像 FROM xxx 特殊的:scratch 代表空镜像,即不需要依赖镜像环境 为了安全,尽量不要使用非官方的镜像

EXPOSE:声明镜像内的服务监听端口,EXPOSE 8080 \ EXPOSE 8080/tcp /后面是协议不写默认tcp,EXPOSE的作用不是直接映射端口,而是声明使用的端口,如果build时使用了-P自动映射端口则会将 8080映射到宿主机的随机端口,如果要指定则应当使用 -p 手动指定

ARG :设置镜像创建时的变量,ARG [k=v]...,编译结束后变量将不存在,docker内置了一些变量HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY(不区分大小写),这些变量不需要再次声明,同docker build时的 –build-arg

LABEL:设置镜像使用的元数据,用来写一些描述信息 版本号之类的LABEL version="1.0",同 –label “version=1.0”

ENV:设置常量 MYSQL_VERSION 值为10ENV MYSQL_VERSION 5.6 调用 RUN apt-get install -y mysql-server="${MYSQL_VERSION}"$MYSQL_VERSION

ENTRYPOINT:镜像的默认入口命令,类似main函数,启动时作为根命令执行

VOLUME:创建数据卷,详见==基于dockerfile创建镜像==下面的例,以及上面的数据卷部分

USER:指定运行容器时的用户名或uid

WORKDIR:约等于 RUN cd,但如果没有路径会直接创建 例如 WORKDIR /test在根目录创建/进入 test,能使用WORKDIR应当避免 run,尽量使用绝对路径

ONBUILD:创建子镜像时,自动执行的指令

SHELL:指定默认shell类型

操作指令
1
2
3
4
RUN:执行命令行命令,因为每次run都会新加一层(image Layer)所以更推荐把需要执行的命令写在同一行内 比如:`apt-update && apt-get upgrade` 为了美观(一行不写太长)可以使用 \ 来换行
CMD:类似于RUN但RUN在docker build时执行 CMD在docker run时执行 cmd只能有一条,如果dockerfile里有多条则执行最后一条,常用于:1.在run时运行一个可执行的文件并提供参数 2.为ENTRYPOINT指定参数 3.是以"/bin/sh -c"的方法执行的命令
ADD:将本地文件 hello 写入根目录 `ADD hello /`,`ADD`被执行时会顺便解压缩,如果需要添加远程文件\目录 请使用 `RUN wget\curl`
COPY:将本地文件 hello 写入根目录 `COPY hello /`

基于dockerfile创建镜像

docker build [命令参数] PATH | URL | [Dockerfile所在目录,.表示当前目录]

注意:在docker build时会将目标目录下的所以文件发送给服务端解析 所以dockerfile文件夹里尽量不要放无关的东西

命令参数包括:

  • –add-host list:添加自定义主机名到ip映射
  • –build-arg list:设置镜像创建时的变量, --build-arg [k1=v1],[k2=v2]... ,编译结束后变量将不存在,docker内置了一些变量HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY(不区分大小写),这些变量不需要再次声明
  • –cache-from strings: cache-from,指定使用哪个镜像的cache(缓存),当一个dockerfile第二次构建镜像时时,在它会使用前一次构建时的缓存,直到遇到第一条不同的指令为止,如果不想使用cache,可以使用下面的no-cache参数
  • –cpu-shares :设置 cpu 使用权重
  • –cpu-period :限制 CPU CFS周期
  • –cpu-quota :限制 CPU CFS配额
  • –cpuset-cpus :指定使用的CPU id
  • –cpuset-mems :指定使用的内存 id
  • –disable-content-trust :忽略校验,默认开启
  • -f,–file :指定要使用的Dockerfile路径
  • –force-rm :设置镜像过程中删除中间容器
  • –iidfile string:将镜像id写入文件
  • –isolation string:使用容器隔离技术
  • –label list :设置镜像使用的元数据,用来写一些描述信息 版本号之类的LABEL version="1.0"
  • -m,–memory bytes :设置内存最大值
  • –memory-swap bytes:设置Swap的最大值为内存+swap,"-1"表示不限swap
  • –no-cache :创建镜像的过程不使用缓存
  • –pull :尝试去更新镜像的新版本
  • –quiet, -q :安静模式,成功后只输出镜像 ID
  • –rm :设置镜像成功后删除中间容器
  • –shm-size :设置/dev/shm的大小,默认值是64M
  • –squash :将 Dockerfile 中所有的操作压缩为一层
  • –ulimit :Ulimit配置
  • –tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
  • –network: 默认 default。在构建期间设置RUN指令的网络模式

例:

1
2
3
mkdir dockerfile01
cd dockerfile01
vim Dockerfile
1
2
3
4
FROM ubuntu									# 以ubuntu:latest镜像为基础执行dockerfile
run mkdir /myvol							# 在根目录下创建myvol文件夹
RUN echo "hello world" > /myvol/greeting	# 在/myvol文件夹下创建greeting并写入hello world
VOLUME /myvol								# 创建数据卷/myvol
1
docker build -t dockerfile-volume .			# 编译当前目录下的dockerfile并将生成镜像命名为dockerfile-volume

.dockerignore文件

docker build .时会将当前目录下的所有文件从客户端发送到服务端进行读取、编译,.dockerignore文件的作用在于指定那些不必要发送的文件,提供编译速度

docker-compose

使用一个yml文件来统一管理构成应用程序的服务

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序

go&mysql的docker-compose实例

目录

go的东西和 mysql的东西分别放在两个文件夹下(compose貌似对文件夹名称的大小写不敏感)

testBash是一个持久的基于MySQL镜像的容器

docker-compose.yaml 在根目录中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
├─docker-compose.yaml
├─Go
│      Dockerfile
│      go.mod
│      go.sum
│      main.go
├─MySQL
│       Dockerfile
│       test.sql
└─testBash
        Dockerfile

==./Go/main.go==

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
	"database/sql"
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql"
)

func main() {
	cnn, err := sql.Open("mysql", "root:123456@tcp(mydb:3306)/test_db")
	//cnn, err := sql.Open("mysql", "root:123456@tcp(host.docker.internal:3306)/test_db")
	if err != nil 
		log.Fatal(err)
	}

	id := 1
	var name string

	if err := cnn.QueryRow("SELECT name FROM test_tb WHERE id = ? LIMIT 1", id).Scan(&name); err != nil {
		log.Fatal(err)
	}

	fmt.Println(id, name)
}

==./Go/Dockerfile==

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# syntax=docker/dockerfile:1

FROM golang:1.20.4

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go env -w GOPROXY=https://goproxy.cn,direct
RUN go mod download

COPY *.go ./

RUN go build -o /docker-gs-ping

EXPOSE 8080

CMD [ "/docker-gs-ping" ]

==./MySQL/test.sql==

1
2
3
4
CREATE DATABASE test_db;
Use test_db;
Create table `test_tb` (id int, name varchar(20));
Insert into test_tb (id, name) values (1, 'test-user');

==./MySQL/Dockerfile==

1
2
FROM mysql:latest
COPY test.sql /docker-entrypoint-initdb.d/test.sql

==./testBash/Dockerfile==

1
2
FROM mysql:latest
CMD ["/bin/bash"]

==./docker-compose.yaml==

depends_on: 依赖于,app依赖于mydb所以app在mydb之后创建

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '3'
services:
  mydb:
    build:
      context: ./MySQL
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    container_name: golang_db
    ports:
      - "3306:3306"
    tty: true
  app:
    build:
      context: ./Go
    volumes:
      - "./Go:/workspace"
    container_name: golang_app
    ports:
      - "8080:8080"
    tty: true
    depends_on:
      - mydb
  bash:
    build:
      context: ./testBash
    container_name: golang_bash
    tty: true

使用compose命令运行

1
docker compose up --build

借用golang_bash来直接访问数据库

1
docker exec -it golang_bash mysql -h mydb -uroot -p123456

问题:

depends_on保证了容器创建的顺序进行 但golang_db创建后它的mysql未必能在golang_app容器之前创建 golang_app 如果在mysql服务启动之前创建就会连接不到

解决方案参考:docker compose 服务启动顺序控制 - wang_yb - 博客园 (cnblogs.com)

docker仓库/dockerHub

push

连接dockerHub:docker login然后账号密码,如果使用第三方储存库则按照它的规则来

重命名容器与dockerHub相同,如我的dockerHub仓库(repository)为 hub.docker.com/repository/docker/mhqdz/repository-test

欲上传myubuntu:v1则执行该重命名:docker tag myubuntu:v1 mhqdz/repository-test:latest

最后 push 即可:docker push mhqdz/repository-test

pull

直接docker pull即可

1
docker pull mhqdz/repository-test

使用 registry 搭建本地仓库

参考:Registry私有仓库搭建及认证 - 暴走小骚年 - 博客园 (cnblogs.com)

使用创建本地仓库
1
dockder pull registry
1
docker run -d -p 5000:5000 --name my-registry -v /mnt/d/docker/data/my-registry:/var/lib/registry registry

命令解释:

  • -p 5000:5000:本机与容器端口映射
  • -v /mnt/d/docker/data/my-registry:/var/lib/registry:数据卷映射 本地的my-registry对于容器里的registry
push本地镜像

类似之前dockerhub只不过那个网址变成了localhost/

1
docker tag myubuntu:v1 localhost:5000/my-ubuntu  
1
docker push localhost:5000/my-ubuntu

docker网络

docker网络性能较差,在大型容器集群中网络会成为很大的挑战

为此 出现了第三方解决方案:Pipework ,Weave,Flannel

以及官方解决方案Libnetwork(出世晚于第三方)

libnetwork

libnetwork提供了一个容器连接的go实现,libnetwork使用了CNM新型容器网络模型(Container network model)

它使docker具备了跨主机的能力 同一子网络内的容器可以在不同的主机上互相通信

libnetwork实现的网络驱动

  • bridge: Docker传统上默认用Linux网桥和Iptables实现的单机网络

bridge

  • host: 容器与主机共享同一 Network Namespace,共享同一套网络协议栈、路由表及 iptables 规则等。容器与主机看到的是相同的网络视图

  • null: 不提供网络服务,容器启动后无网络连接

  • remote: 扩展类型,预留给其他外部实现的方案,比如有一套第三方的 SDN 方案(如 OpenStack Neutron)就可以接进来

  • overlay: 用 vxlan 隧道实现的跨主机容器网络

overlay

CNM

概念定义

  • 网络沙盒:容器内隔离的网络环境,包含了对网络栈的配置,包括对网络接口和路由表,DNS配置的管理。一个沙盒可以包含多个网络的多个Endpoint
  • Endpoint:端点,可以理解为网络沙盒和网络之间的桥梁,一个Endpoint只能连接一个网络和一个沙盒,沙盒可以通过多个Endpoint连接多个网络
  • 网络:网络包括一组可以相互连接的Endpoint

image-20221015142138025

基础网络管理

在linux平台下,docker容器网络资源通过内核Network Namespace机制实现隔离,不同的Network Namespace下有各自的网络视图(网络设备、协议栈、路由表、防火墙规则等)

概念定义

  • Namespace: 将内核的全局资源封装,使每个Namespace都有一份独立的资源,因此在不同Namespace下的进程使用同种资源互不干涉
  • linux内核的6种namespace linux的6种Namespace介绍
    • IPC: 隔离进程间通信
    • UTC: 隔离主机名和域名信息
    • Mount: 隔离文件系统挂载点
    • PID: 隔离进程的ID
    • Network: 隔离网络资源
    • User: 隔离用户ID和组ID
docker的容器网络模式

docker&redis

1
docker start [redis容器名称]
1
docker exec -it [redis容器名称] /bin/bash

docker&mongo

1
docker run --name mhMongo -d mongo
1
docker start mhMongo
1
docker exec -it mhMongo mongo admin # 以管理员身份进入

docker&hugo

1
docker pull klakegg/hugo:latest-ext # 下载hugo镜像的ext(最新增强版)版本
1
mkdir src # 在当前目录创建src文件夹作为hugo的目录
1
2
# 建立站点(init)
docker run --rm -it -v $pwd/src:/src klakegg/hugo:latest-ext "new site . --force"
1
2
# 新建第一个帖子
docker run --rm -it -v $pwd/src:/src klakegg/hugo:latest-ext "new posts/first_post.md"
1
2
# 新建 about
docker run --rm -it -v $pwd/src:/src klakegg/hugo:latest-ext "new about/_index.md"
1
2
3
4
5
# 下载主题(以meme为例)到themes文件夹下
git clone https://github.com/reuixiy/hugo-theme-meme.git src/themes/meme

# 把原配置文件备份一下 并将meme主题的配置文件拷贝进来
rename-item .\src\config.toml config~.toml & cp src/themes/meme/config-examples/zh-cn/config.toml src/config.toml
1
2
# 启动服务
docker run --rm -it -v $pwd/src:/src -p 1313:1313 klakegg/hugo:latest-ext server

乱七八糟的问题

1
2
# go编译的二进制文件在alpine中无法运行 提示 sh:xxx:not found
go build --tags  netgo -o xxx *.go
1
# docker exec 进入alpine时使用sh而不是/bin/bash
updatedupdated2023-07-152023-07-15