Docker 笔记
2019-04-19 15:54:21 7 举报AI智能生成
Docker笔记
Docker
Dockerfile
模版推荐
作者其他创作
大纲/内容
监控
cAdvisor
时区同步
方案1
创建容器的时候指定启动参数,自动挂载localtime文件到容器内
docker run --name <name> -v /etc/localtime:/etc/localtime:ro ....
方案2
把时区设置加入到Dockerfile中
# CentOS<br>RUN echo "Asia/shanghai" > /etc/timezone;<br># Ubuntu<br>RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
常用镜像
Docker 私有仓库
registry
docker run \<br>-d \<br>--restart always \<br>-p 5000:5000 \<br>--privileged=true \<br>-v /opt/registry:/tmp/registry \<br>registry
/tmp/registry
仓库存储路径
GitLab 源码托管仓库
gitlab/gitlab-ce
docker run --detach \<br> --hostname gitlab.william.com \<br> --publish 8443:443 --publish 48080:80 --publish 8022:22 \<br> --name gitlab \<br> --restart always \<br> --volume /opt/gitlab/config:/etc/gitlab \<br> --volume /opt/gitlab/logs:/var/log/gitlab \<br> --volume /opt/gitlab/data:/var/opt/gitlab \<br> gitlab/gitlab-ce:latest
Jenkins 持续集成工具
jenkinsci/blueocean
DOCKER_BIND_BASE=$HOME/docker-volumes<br>DOCKER_CONTAINER_NAME=jenkins-blueocean<br>docker run \<br>--name DOCKER_CONTAINER_NAME \<br>-u root \<br>-d \<br>--restart always \<br>-p 38080:8080 \<br>-p 30000:50000 \<br>-v $DOCKER_BIND_BASE/$DOCKER_CONTAINER_NAME/var/jenkins_home:/var/jenkins_home \<br>-v $DOCKER_BIND_BASE/$DOCKER_CONTAINER_NAME/home:/home \<br>-v $DOCKER_BIND_BASE/$DOCKER_CONTAINER_NAME/root:/root \<br>-v /var/run/docker.sock:/var/run/docker.sock \<br>jenkinsci/blueocean
/var/jenkins_home
Jenkins主目录
/var/run/docker.sock
容器与Docker守护进程通信
如果 jenkinsci/blueocean 容器需要实例化其他Docker容器,则该守护进程是必需的。<br>如果运行声明式管道,其语法包含agent部分用 docker 。<br>例如,agent { docker { ... } } 此选项是必需的。
/root/.m2/repository
Maven本地仓库路径
挂载到宿主机上
Home URL
http://${host}:${port}
http://${host}:${port}/blue
Maven构建环境
maven:3.6.1-jdk-8-alpine
JDK基础镜像
openjdk:11-jdk-slim
openjdk:8-jdk-alpine
Windows基础镜像
microsoft/nanoserver
microsoft/windowsservercore
emqx镜像
emqx/emqx
EMQ X R3.0 配置文件
etc/emqx.config
etc/acl.conf
etc/ssl_dist.conf
etc/vm.args
etc/plugins/*.conf
etc/emqx_recon.conf
etc/emqx_retainer.conf
etc/emqx_management.conf
etc/emqx_dashboard.conf
etc/emqx_auth_username.conf
etc/emqx_auth_clientid.conf
etc/emqx_auth_mysql.conf
etc/emqx_auth_http.conf
插件
emqx_recon
Recon 性能调试插件
集成了 recon 性能调测库,可用于查看当前系统的一些状态信息
configuration
etc/emqx_recon.conf
emqx_retainer
Retainer 插件
该插件设置为默认启动,为 EMQ X 提供 PUBLISH 的 Retained 类型的消息支持。它会将所有主题的 Retained 消息存储在集群的数据库中,并待有客户端订阅该主题的时候将该消息投递出去。
configuration
etc/emqx_retainer.conf
emqx_dashboard
Dashboard 插件
是 EMQ X 消息服务器的 Web 管理控制台, 该插件默认开启
configuration
etc/emqx_dashboard.conf
emqx_management
EMQ X Management API and CLI
configuration
etc/emqx_management.conf
emqx_auth_username
用户名密码认证插件
目前只包含 连接认证 功能。其逻辑与 emqx_auth_clientid 相似,只不过其关心的是 username
configuration
etc/emqx_auth_username.conf
auth.user.password_hash = sha256
使用 Rest API 进行增删改查
emqx_auth_clientid
ClientID 密码认证插件
目前只包含 连接认证 功能不包括 访问控制 。他会允许满足其配置中 clientid 成功登录。其中值得注意的是 password 以明文的方式进行添加记录,在存储入系统时会按照配置的 hash 算法加密后存入。客户端在连接时应该携带对应的密文进行连接。
configuration
etc/emqx_auth_clientid.conf
auth.client.password_hash = sha256
使用 Rest API 进行增删改查
emqx_auth_mysql
MySQL 认证/访问控制插件
支持访问 MySQL 来完成 连接认证 访问控制 等功能
configuration
etc/emqx_auth_mysql.conf
emqx_auth_http
HTTP 认证/访问控制插件
实现 连接认证 与 访问控制 的功能。它会将每个请求发送到指定的 HTTP 服务,通过其返回值来判断是否具有具体操作的权限。
configuration
etc/emqx_auth_http.conf
HTTP API 返回值处理
认证成功
忽略此次认证
认证失败
emqx_psk_file
PSK 认证插件
主要提供了 PSK 支持。其目的是用于在客户端建立 TLS/DTLS 连接时,使用 PSK 方式达到 连接认证 的功能
配置(环境变量)
EMQ X Configuration
不可映射到配置文件到环境变量
EMQX_NAME<br>
container name
EMQX_HOST
container IP
EMQX_WAIT_TIME
5
EMQX_JOIN_CLUSTER
none
EMQX_ADMIN_PASSWORD
public
EMQX_ prefix
All EMQ X Configuration in etc/emqx.conf could config by environment
The environment variables which with EMQX_ prefix are mapped to configuration file, . get replaced by __.
If set EMQX_NAME and EMQX_HOST, and unset EMQX_NODE__NAME, EMQX_NODE__NAME=$EMQX_NAME@$EMQX_HOST.
etc/emqx.conf
PLATFORM_ prefix
PLATFORM_ETC_DIR
Default
/opt/emqx/etc
Mapped
{{ platform_etc_dir }}
PLATFORM_LOG_DIR
Default
/opt/emqx/log
Mapped
{{ platform_log_dir }}
PLATFORM_DATA_DIR
Default
/opt/emqx/data
Mapped
{{ platform_data_dir }}
PLATFORM_LIB_DIR
Default
/opt/emqx/lib
Mapped
{{ platform_lib_dir }}
EMQ Loaded Plugins Configuration
EMQX_LOADED_PLUGINS
Default
"emqx_recon,emqx_retainer,emqx_management,emqx_dashboard"<br>
When you need to customize the loaded plugin, emqx_mangement must be loaded in the first place.
EMQX_LOADED_PLUGINS="emqx_mangement,emqx_auth_username,emqx_auth_mysql,emqx_recon,emqx_retainer,emqx_dashboard"
EMQ X Plugins Configuration
The environment variables which with EMQX_ prefix are mapped to all emqx plugins' configuration file, . get replaced by __.
Cluster
docker run --rm -ti --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 -p 6000-6100:6000-6100 \<br> -e EMQX_NAME="emqx" \<br> -e EMQX_HOST="t.emqx.io" \<br> -e EMQX_LISTENER__TCP__EXTERNAL=1883 \<br> -e EMQX_JOIN_CLUSTER="emqx@t.emqx.io" \<br> emqx:latest
Kernel Tuning
docker run --rm -ti --name emqx -p 18083:18083 -p 1883:1883 -p 4369:4369 \<br> --sysctl fs.file-max=2097152 \<br> --sysctl fs.nr_open=2097152 \<br> --sysctl net.core.somaxconn=32768 \<br> --sysctl net.ipv4.tcp_max_syn_backlog=16384 \<br> --sysctl net.core.netdev_max_backlog=16384 \<br> --sysctl net.ipv4.ip_local_port_range=1000 65535 \<br> --sysctl net.core.rmem_default=262144 \<br> --sysctl net.core.wmem_default=262144 \<br> --sysctl net.core.rmem_max=16777216 \<br> --sysctl net.core.wmem_max=16777216 \<br> --sysctl net.core.optmem_max=16777216 \<br> --sysctl net.ipv4.tcp_rmem=1024 4096 16777216 \<br> --sysctl net.ipv4.tcp_wmem=1024 4096 16777216 \<br> --sysctl net.ipv4.tcp_max_tw_buckets=1048576 \<br> --sysctl net.ipv4.tcp_fin_timeout=15 \<br> emqx:latest
REMEMBER: DO NOT RUN EMQ X DOCKER PRIVILEGED OR MOUNT SYSTEM PROC IN CONTAINER TO TUNE LINUX KERNEL, IT IS UNSAFE.
Run emqx
docker run \<br>--rm \<br>-ti \<br>-u root \<br>-p 18083:18083 -p 1883:1883 -p 8083:8083 \<br>emqx/emqx:latest
DOCKER_BIND_BASE=$HOME/docker-volumes<br>DOCKER_CONTAINER_NAME=emqx<br>docker run \<br>--rm \<br>-ti \<br>--name emqx \<br>-e EMQX_HOST=192.168.43.31 \<br>-e EMQX_LOADED_PLUGINS="emqx_recon,emqx_retainer,emqx_management,emqx_dashboard" \<br>-p 18083:18083 -p 1883:1883 \<br>-v $DOCKER_BIND_BASE/$DOCKER_CONTAINER_NAME/opt/emqx:/opt/emqx \<br>emqx/emqx:latest
DOCKER_BIND_BASE=$HOME/docker-volumes<br>DOCKER_CONTAINER_NAME=emqx<br>docker run \<br>--rm \<br>-ti \<br>--name $DOCKER_CONTAINER_NAME \<br>-e EMQX_LOADED_PLUGINS="emqx_mangement,emqx_auth_http,emqx_recon,emqx_retainer,emqx_dashboard" \<br>-e EMQX_AUTH__HTTP__AUTH_REQ="http://192.168.2.100:9080/mqtt/auth" \<br>-e EMQX_AUTH__HTTP__AUTH_REQ__PARAMS="clientid=%c,username=%u,password=%P,ipaddr=%a,cerCommonName=%cn,cerSubject=%dn" \<br>-e EMQX_AUTH__HTTP__SUPER_REQ="http://192.168.2.100:9080/mqtt/superuser" \<br>-e EMQX_AUTH__HTTP__SUPER_REQ__PARAMS="clientid=%c,username=%u,ipaddr=%a" \<br>-e EMQX_AUTH__HTTP__ACL_REQ="http://192.168.2.100:9080/mqtt/auth" \<br>-e EMQX_AUTH__HTTP__ACL_REQ__PARAMS="access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t" \<br>-p 18083:18083 -p 1883:1883 \<br>-v $DOCKER_BIND_BASE/$DOCKER_CONTAINER_NAME/opt/emqx/:/opt/emqx/ \<br>emqx/emqx:latest
docker run \<br>--rm \<br>-ti \<br>-u root \<br>-e EMQX_LOADED_PLUGINS="emqx_mangement,emqx_auth_http,emqx_recon,emqx_retainer,emqx_dashboard" \<br>-e EMQX_AUTH__HTTP__AUTH_REQ="http://192.168.2.100:9080/mqtt/auth" \<br>-e EMQX_AUTH__HTTP__AUTH_REQ__PARAMS="clientid=%c,username=%u,password=%P,ipaddr=%a,cerCommonName=%cn,cerSubject=%dn" \<br>-e EMQX_AUTH__HTTP__SUPER_REQ="http://192.168.2.100:9080/mqtt/superuser" \<br>-e EMQX_AUTH__HTTP__SUPER_REQ__PARAMS="clientid=%c,username=%u,ipaddr=%a" \<br>-e EMQX_AUTH__HTTP__ACL_REQ="http://192.168.2.100:9080/mqtt/auth" \<br>-e EMQX_AUTH__HTTP__ACL_REQ__PARAMS="access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t" \<br>-p 18083:18083 -p 1883:1883 \<br>emqx/emqx:latest
运维操作
根据宿主机进程PID查找归属容器ID
docker inspect -f "{{.Id}} {{.State.Pid}} {{.Name}} " $(docker ps -q) |grep <PID><br>
常见问题
ADD failed: stat /var/lib/docker/tmp/docker-builderXXXXXX: no such file or directory
Failed to load listeners: can't create unix socket /var/run/docker.sock: device or resource busy
Error response from daemon: conflict: unable to delete ec48cef68f26 (cannot be forced) - image has dependent child images
原因是有另外的 image FROM 了这个 image
例如,基于该镜像生成了新的镜像tag
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxxxxx)<br>
Docker容器修改时区和时间同步
解决Docker容器时区及时间不同步问题
Docker for Mac listen on tcp
github issue
Docker for Mac doesn't listen on 2375
socat container
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 127.0.0.1:1234:1234 bobrik/socat TCP-LISTEN:1234,fork UNIX-CONNECT:/var/run/docker.sock<br>
export DOCKER_HOST=tcp://localhost:1234<br>
socat command line
brew install socat<br>
socat TCP-LISTEN:2375,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock &<br>
概念知识
Docker Engine API
Docker Deamon (dockerd)
Docker Daemon是Docker的守护进程,Docker Client通过命令行与Docker Damon通信,完成Docker相关操作
Daemon configuration file
Linux
/etc/docker/daemon.json
OSX
~/.docker/daemon.json
Windows
%programdata%\docker\config\daemon.json
Docker daemon directory<br>
Linux
/var/lib/docker
Windows
C:\ProgramData\docker
Daemon socket
Socket Types
unix domain socket <br>(or IPC socket)
/var/run/docker.sock
requiring either root permission, or docker group membership.
tcp Socket
Access the Docker daemon remotely
docker -H tcp://0.0.0.0:2375 ps
fd<br>Systemd socket<br>
dockerd -H fd://3
ssh connect
docker -H ssh://me@example.com:22 ps
Starting with Docker 18.09
举例
sudo dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2
listen default socket
-H
unix:///var/run/docker.sock
Read the logs
macOS (Docker 18.01+)
~/Library/Containers/com.docker.docker/Data/vms/0/console-ring
macOS (Docker <18.01)
~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/console-ring
Ubuntu 16.04+<br>CentOS
journalctl -u docker.service
Debian GNU/Linux
/var/log/daemon.log
Windows
AppData\Local
Docker Cient (docker)
Docker client config file
OSX
~/.docker/config.json
-H
Linux
unix:///var/run/docker.sock
Windows
tcp://127.0.0.1:2376
/var/run/docker.sock
docker-machine
是支持多平台安装Docker的工具,使用 Docker Machine,可以很方便地在笔记本、云平台及数据中心里安装Docker。
docker-compose
是用来组装多容器应用的工具,可以在 Swarm集群中部署分布式应用。
Docker Swarm
是Docker社区原生提供的容器集群管理工具。
节点 (node)
管理 (manager) 节点
工作 (worker) 节点
任务 (Task)
服务 (Services)
replicated services
global services
OS/Arch
docker system info --format '{{.OSType}} {{.Architecture}}'
linux x86_64
docker inspect openjdk:8-jdk-alpine --format '{{.Os}} {{.Architecture}}'
linux amd64
amd64 (aka x86-64)
docker inspect microsoft/nanoserver --format '{{.Os}} {{.Architecture}}'
构建镜像
Dockerfile
FROM
ARG
ADD
ENV
CMD
ENTRYPOINT
docker build
docker build [OPTIONS] PATH | URL | -
OPTIONS
--file, -f
Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
--tag, -t
镜像的名字及tag
--build-arg
设置构建时的变量
--no-cache
不使用Build Cache构建镜像
PATH<br>URL
Dockerfile path or url
举例
docker build <br>-f Dockerfile<br>-t {image name}:{tag} <br>--build-arg JAR_FILE=target/xxx.jar <br>--build-arg JAR_NAME=xxx.jar <br>--no-cache <br>./
docker build -t reg.enncloud.cn/iot/spring-boot-admin-server:1.0.0 --build-arg JAR_FILE=target/spring-boot-admin-server-1.0.0.jar --build-arg JAR_NAME=xxx.jar --no-cache ./<br>
docker build \<br>-f target/maven-shared-archive-resources/Dockerfile \<br>-t reg.enncloud.cn/iot/spring-cloud-eureka-server:1.0.0 \<br>--build-arg JAR_FILE=target/spring-cloud-eureka-server-1.0.0.jar \<br>--build-arg JAR_NAME=spring-cloud-eureka-server-1.0.0.jar \<br>./
docker buildx
开启 buildx 实验特性
向内核注册 platform
docker run --privileged --rm docker/binfmt:a7996909642ee92942dcd6cff44b9b95f08dad64
~/.docker/config.json
{<br> ...<br> "experimental": “enabled”<br>}
docker buildx ls
docker buildx build
docker buildx build --platform linux/arm/v7 -t arm-build .
Manifest Lists
docker tag
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
Maven Docker插件构建
Docker命令
镜像仓库
login
docker login http://xxxxx.com
pull
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull openjdk:8-jdk-alpine
docker pull --platform amd64 openjdk:8-jdk-alpine
push
docker push xxxxx.com/abc-dev/arc:1334
search
docker search [OPTIONS] TERM
docker search -s 10 openjdk
查询tag标签
curl 'https://registry.hub.docker.com/v2/repositories/library/openjdk/tags/'|jq '."results"[]["name"]'
本地镜像管理
images
rmi
删除全部 untagged images
docker rmi $(docker images | grep "<none>" | awk '{print $3}')
删除全部 images
docker rmi $(docker images -q)
删除build过程中产生的镜像
docker image prune -a -f
删除虚悬镜像
docker rmi $(docker images -f "dangling=true" -q)
tag
docker tag 2e25d8496557 xxxxx.com/abc-dev/arc:1334
build
prune
history
查看镜像构建历史
docker history docker.io/mysql:5.7
查看镜像构建历史具体信息
docker history --no-trunc docker.io/mysql:5.7<br>
save/load
docker save ubuntu:load>/root/ubuntu.tar<br>docker load<ubuntu.tar
image
prune
Remove unused images
docker image prune -af
system
df
prune
容器生命周期管理
run
start/stop/restart
docker stop $(docker ps -a -q)
docker rm -f $(docker ps -a -q)
kill
rm
pause/unpause
create
exec
docker exec -it {CONTAINER} /bin/bash
容器操作
ps
容器状态
Created
Up {time} ago
Exited({status}) {time} ago
inspect
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
查看容器大小
docker inspect -f {{".Size"}} docker.io/mysql:5.7<br>
top
attach
events
logs
wait
port
export/import
docker export 98ca36> ubuntu.tar<br>cat ubuntu.tar | sudo docker import - ubuntu:import
info|version
info
version
system
data volume
volume create --name <name>
volume inspect <name>
volume ls
volume rm
挂载宿主机目录到容器
bind
挂载宿主机volume卷到容器
volume
监控
stats
docker stats --no-stream
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}"
编排容器(服务编排)<br>docker-compose<br>
安装
sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose<br>
sudo chmod +x /usr/local/bin/docker-compose<br>
docker-compose -v<br>
命令
up
构建、启动容器
docker-compose up -d
后台启动并运行容器
ps
列出所有运行容器
logs
查看服务日志输出<br>
port
docker-compose port eureka 8761<br>
输出 eureka 服务 8761 端口所绑定的公共端口
build
构建或者重新构建服务
start
启动指定服务已存在的容器
stop
停止已运行的服务的容器
rm
删除指定服务的容器
docker-compose rm eureka<br>
kill
通过发送 SIGKILL 信号来停止指定服务的容器
docker-compose kill eureka<br>
pull
下载服务镜像
scale
设置指定服务运行容器的个数,以 service=num 形式指定
docker-compose scale user=3 movie=3<br>
run
在一个服务上执行一个命令
docker-compose run web bash<br>
docker-compose.yml
version
指定 docker-compose.yml 文件的写法格式
services
多个容器集合
build
配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
command
覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000<br>
command: [bundle,exec,thin,-p,3000]<br>
dns
配置 dns 服务器,可以是一个值或列表
dns_search
配置 DNS 搜索域,可以是一个值或列表
dns_search: example.com<br>
dns_search:<br> - dc1.example.com<br> - dc2.example.com
environment
环境变量配置,可以用数组或字典两种方式
env_file
从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于
expose
暴露端口,只将端口暴露给连接的服务,而不暴露给主机
expose:<br> - "3000"<br> - "8000"
image
指定服务所使用的镜像
network_mode
设置网络模式
network_mode: "bridge"<br>network_mode: "host"<br>network_mode: "none"<br>network_mode: "service:[service name]"<br>network_mode: "container:[container name/id]"
ports
对外暴露的端口定义,和 expose 对应
ports: # 暴露端口信息 - "宿主机端口:容器暴露端口"<br>- "8763:8763"<br>- "8763:8763"
links
将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
links: # 指定服务名称:别名 <br> - docker-compose-eureka-server:compose-eureka
注意:不推荐使用该指令。
volumes
卷挂载路径
volumes:<br> - /lib<br> - /var
logs
日志输出信息
--no-color 单色输出,不显示其他颜.<br>-f, --follow 跟踪日志输出,就是可以实时查看日志<br>-t, --timestamps 显示时间戳<br>--tail 从日志的结尾显示,--tail=200
使用场景
更新容器<br>
当服务的配置发生更改时,可使用 docker-compose up 命令更新配置
此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去<br>
links
服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务<br>
version: '2'<br>services:<br> web:<br> build: .<br> links:<br> - "db:database"<br> db:<br> image: postgres
Collect
Get Started
Collect
Get Started
Collect
Get Started
Collect
Get Started
评论
0 条评论
下一页