基本
在后台创建和运行容器
$ docker run -d -p 80:80 docker/getting-started
• -d – 以分离(后台)模式运行容器
• -p 80:80 – 将端口 80 映射到容器中的端口 80,格式:宿主机端口:容器端口
• docker/getting-started – 要使用的镜像
在前台创建并运行容器(之后如果要退出容器但是不关闭容器,按 Ctrl+P+Q 即可)
$ docker run -it –rm -p 8001:8080 –name my-nginx nginx
• -it – 交互式 bash 模式
• –rm – 容器终止运行后自动删除容器文件
• -p 8001:8080 – 将 8001 端口映射到容器中的 8080 端口
• –name my-nginx – 指定名称
• nginx – 要使用的镜像
一般命令
Example Description
docker ps 列出正在运行的容器
docker ps -a 列出所有容器
docker ps -s 列出正在运行的容器 **(带 CPU / 内存)
docker images 列出所有镜像
docker exec -it bash 连接到容器
docker logs 显示容器的控制台日志
docker stop 停止容器
docker restart 重启一个容器
docker rm 移除一个容器
docker port 显示容器的端口映射
docker top 列出进程
docker kill 杀死一个容器
参数 可以是容器 id 或名称
Docker 容器
启动和停止
Description Example
docker start nginx-server 开始
docker stop nginx-server 停止
docker restart nginx-server 重启
docker pause nginx-server 暂停
docker unpause nginx-server 取消暂停
docker wait nginx-server 阻塞容器
docker kill nginx-server 发送 SIGKILL
docker attach nginx-server 连接到现有容器
说明
Example Description
docker ps 列出正在运行的容器
docker ps -a 列出所有容器
docker logs nginx-server 容器日志
docker inspect nginx-server 检查容器
docker events nginx-server 容器事件
docker port nginx-server 公共端口
docker top nginx-server 运行进程
docker stats nginx-server 容器资源使用
docker diff nginx-server 列出对容器所做的更改
创建容器
docker create [options] IMAGE
-a, –attach # 附加标准输出/错误
-i, –interactive # 附加标准输入(交互式)
-t, –tty # 伪终端 pseudo-tty
–name NAME # 命名你的镜像
-p, –publish 5000:5000 # 端口映射(主机:容器)
–expose 5432 # 向容器公开端口
-P, –publish-all # 发布所有端口
–link container:alias # 链接 linking
-v, –volume `pwd`:/app # mount(需要绝对路径)
-e, –env NAME=hello # 环境变量 env vars
实例
$ docker create –name my_redis –expose 6379 redis:3.0.2
操控
重命名容器
docker rename my-nginx nginx-server
移除容器
docker rm nginx-server
更新容器
docker update –cpu-shares 512 -m 300M nginx-server
Docker 镜像
操控
Example Description
docker images 列出镜像
docker rmi nginx 删除镜像
docker load < ubuntu.tar.gz 加载一个 tarred 存储库 docker load –input ubuntu.tar 加载一个 tarred 存储库 docker save busybox > ubuntu.tar 将镜像保存到 tar 存档
docker history 显示镜像的历史
docker commit nginx my_nginx 将容器另存为镜像
docker tag nginx eon01/nginx 标记镜像
docker push eon01/nginx 推送镜像
构建镜像
# 注意有的最后面是英文 .
$ docker build .
$ docker build github.com/creack/docker-firefox
$ docker build – < Dockerfile
$ docker build – < context.tar.gz
$ docker build -t eon/nginx-server .
$ docker build -f myOtherDockerfile .
$ curl example.com/remote/Dockerfile | docker build -f – .
删除 镜像
$ docker rmi -f $(docker images | grep “none” | awk ‘{print $3}’)
Docker 网络
操作
获取容器连接的网络
docker inspect MyContainer | grep Network
删除网络
docker network rm MyOverlayNetwork
列出网络
docker network ls
获取有关网络的信息
docker network inspect MyOverlayNetwork
将正在运行的容器连接到网络
docker network connect MyOverlayNetwork nginx
启动时将容器连接到网络
docker run -it -d –network=MyOverlayNetwork nginx
断开容器与网络的连接
docker network disconnect MyOverlayNetwork nginx
创建网络
docker network create -d overlay MyOverlayNetwork
docker network create -d bridge MyBridgeNetwork
docker network create -d overlay \
–subnet=192.168.0.0/16 \
–subnet=192.170.0.0/16 \
–gateway=192.168.0.100 \
–gateway=192.170.0.100 \
–ip-range=192.168.1.0/24 \
–aux-address=”my-router=192.168.1.5″ \
–aux-address=”my-switch=192.168.1.6″ \
–aux-address=”my-printer=192.170.1.5″ \
–aux-address=”my-nas=192.170.1.6″ \
MyOverlayNetwork
Docker 快捷键
退出
Docker 快捷键 说明
ctrl+c 将关闭容器,并删除当前的容器实例
ctrl+d 将保留容器,并退出到 Docker 主机的命令行界面
ctrl+p+q 将容器分离,保留容器,但是不退出
需要特别注意的是,上面的退出快捷键中的删除容器实例只对于使用 docker attach 进入的容器生效,使用 docker exec 进入容器后使用上面的快捷键后将隔离容器且不会删除容器实例。
各种各样的
Docker Hub
Docker 语法 说明
docker search search_word 在 docker hub 中搜索镜像
docker pull user/image 从 docker hub 下载镜像
docker login 向 docker hub 进行身份验证
docker push user/image 将镜像上传到 docker hub
镜像仓库命令
登录到镜像仓库
$ docker login
$ docker login localhost:8080
从镜像仓库注销
$ docker logout
$ docker logout localhost:8080
搜索镜像
$ docker search nginx
$ docker search nginx –stars=3 –no-trunc busybox
拉取镜像
$ docker pull nginx
$ docker pull eon01/nginx localhost:5000/myadmin/nginx
推送镜像
$ docker push eon01/nginx
$ docker push eon01/nginx localhost:5000/myadmin/nginx
批量清除
实例 说明
docker stop -f $(docker ps -a -q) 停止所有容器
docker rm -f $(docker ps -a -q) 删除所有容器
docker rmi -f $(docker images -q) 删除所有镜像
卷 volume
检查卷
$ docker volume ls
清理未使用的卷
$ docker volume prune
Docker Compose
:- :-
docker-compose up 创建和启动容器
docker-compose up -d 以分离模式创建和启动容器
docker-compose down 停止和删除容器、网络、映像和卷
docker-compose logs 查看容器的输出
docker-compose restart 重启所有服务
docker-compose pull 拉取所有服务的镜像
docker-compose build 构建所有服务的镜像
docker-compose config 验证并查看 Compose 文件
docker-compose scale = 为服务指定容器个数
docker-compose top 显示正在运行的进程
docker-compose run -rm -p 2022:22 web bash 启动 Web 服务并运行 bash 作为其命令,删除旧容器
Docker Services
:- :-
docker service create
--add-host list # 添加自定义主机到 IP 映射 (host:ip)
-a, --attach list # 连接到 STDIN、STDOUT 或 STDERR
--blkio-weight uint16 # 块 IO(相对权重),介于 10 和 1000 之间,或 0 禁用(默认 0)
--blkio-weight-device list # 块 IO 权重(相对设备权重)(默认 [])
--cap-add list # 添加 Linux 功能
--cap-drop list # 放弃 Linux 功能
--cgroup-parent string # 容器的可选父 cgroup
--cgroupns string # 要使用的 Cgroup 命名空间(主机|私有)
# 'host': 在 Docker 主机的 cgroup 命名空间中运行容器
# 'private': 在自己的私有 cgroup 命名空间中运行容器
# '': 使用由守护进程上的
# default-cgroupns-mode 选项配置的 cgroup 命名空间(默认)
--cidfile string # 将容器 ID 写入文件
--cpu-period int # 限制 CPU CFS(完全公平调度器)周期
--cpu-quota int # 限制 CPU CFS(完全公平调度器)配额
--cpu-rt-period int # 以微秒为单位限制 CPU 实时周期
--cpu-rt-runtime int # 以微秒为单位限制 CPU 实时运行时间
-c, --cpu-shares int # CPU 份额(相对权重)
--cpus decimal # CPU 数量
--cpuset-cpus string # 允许执行的 CPU (0-3, 0,1)
--cpuset-mems string # 允许执行的 MEM (0-3, 0,1)
--device list # 将主机设备添加到容器
--device-cgroup-rule list # 将规则添加到 cgroup 允许的设备列表
--device-read-bps list # 限制设备的读取速率(每秒字节数)(默认 [])
--device-read-iops list # 限制设备的读取速率(每秒 IO)(默认 [])
--device-write-bps list # 限制设备的写入速率(每秒字节数)(默认 [])
--device-write-iops list # 限制设备的写入速率(每秒 IO)(默认 [])
--disable-content-trust # 跳过镜像验证(默认为 true)
--dns list # 设置自定义 DNS 服务器
--dns-option list # 设置 DNS 选项
--dns-search list # 设置自定义 DNS 搜索域
--domainname string # 容器 NIS 域名
--entrypoint string # 覆盖镜像的默认入口点
-e, --env list # 设置环境变量
--env-file list # 读入环境变量文件
--expose list # 公开一个端口或一系列端口
--gpus gpu-request # 要添加到容器中的 GPU 设备(“全部”以传递所有 GPU)
--group-add list # 添加其他组以加入
--health-cmd string # 运行以检查运行状况的命令
--health-interval duration # 运行检查之间的时间 (ms|s|m|h) (默认 0s)
--health-retries int # 需要报告不健康的连续失败
--health-start-period duration # 开始健康重试倒计时之前容器初始化的开始时间(ms|s|m|h)(默认 0s)
--health-timeout duration # 允许运行一项检查的最长时间 (ms|s|m|h) (默认 0s)
--help # 打印使用
-h, --hostname string # 容器主机名
--init # 在容器内运行一个 init 来转发信号并收获进程
-i, --interactive # 即使没有连接,也保持 STDIN 打开
--ip string # IPv4 地址(例如 172.30.100.104)
--ip6 string # IPv6 地址(例如,2001:db8::33)
--ipc string # 要使用的 IPC 模式
--isolation string # 容器隔离技术
--kernel-memory bytes # 内核内存限制
-l, --label list # 在容器上设置元数据
--label-file list # 读入以行分隔的标签文件
--link list # 添加到另一个容器的链接
--link-local-ip list # 容器 IPv4/IPv6 链路本地地址
--log-driver string # 容器的日志记录驱动程序
--log-opt list # 日志驱动程序选项
--mac-address string # 容器 MAC 地址(例如 92:d0:c6:0a:29:33)
-m, --memory bytes # 内存限制
--memory-reservation bytes # 内存软限制
--memory-swap bytes # 交换限制等于内存加上交换:'-1' 启用无限交换
--memory-swappiness int # 调整容器内存交换(0 到 100)(默认 -1)
--mount mount # 将文件系统挂载附加到容器
--name string # 为容器分配名称
--network network # 将容器连接到网络
--network-alias list # 为容器添加网络范围的别名
--no-healthcheck # 禁用任何容器指定的 HEALTHCHECK
--oom-kill-disable # 禁用 OOM 杀手
--oom-score-adj int # 调整主机的 OOM 首选项(-1000 到 1000)
--pid string # 要使用的 PID 命名空间
--pids-limit int # 调整容器 pids 限制(设置 -1 表示无限制)
--platform string # 如果服务器支持多平台,则设置平台
--privileged # 授予此容器扩展权限
-p, --publish list # 将容器的端口发布到主机
-P, --publish-all # 将所有暴露的端口发布到随机端口
--pull string # 创建前拉取镜像("always"|"missing"|"never")(默认"missing")
--read-only # 将容器的根文件系统挂载为只读
--restart string # 容器退出时应用的重启策略(默认“否”)
--rm # 容器退出时自动移除
--runtime string # 用于此容器的运行时
--security-opt list # 安全选项
--shm-size bytes # /dev/shm 的大小
--stop-signal string # 停止容器的信号(默认“SIGTERM”)
--stop-timeout int # 停止容器的超时(以秒为单位)
--storage-opt list # 容器的存储驱动程序选项
--sysctl map # Sysctl 选项(默认 map[])
--tmpfs list # 挂载 tmpfs 目录
-t, --tty # 分配一个伪 TTY
--ulimit ulimit # ulimit 选项(默认 [])
-u, --user string # 用户名或 UID(格式:<name|uid>[:<group|gid>])
--userns string # 要使用的用户命名空间
--uts string # 要使用的 UTS 命名空间
-v, --volume list # 绑定挂载卷
--volume-driver string # 容器的可选卷驱动程序
--volumes-from list # 从指定容器挂载卷
-w, --workdir string # 容器内的工作目录
docker 全局参数
--config string # 客户端配置文件的位置(默认“~/.docker”)
-c, --context string # 用于连接到守护程序的上下文的名称(
# 覆盖 DOCKER_HOST 环境变量和使用“docker context use”设置的默认上下文)
-D, --debug # 启用调试模式
-H, --host list # 要连接的守护进程套接字
-l, --log-level string # 设置日志级别("debug"\|"info"\|"warn"\|"error"\|"fatal") (默认“info”)
--tls # 使用 TLS; 由 --tlsverify 暗示
--tlscacert string # 仅由该 CA 签署的信任证书(默认为“~/.docker/ca.pem”)
--tlscert string # TLS 证书文件路径(默认“~/.docker/cert.pem”)
--tlskey string # TLS 密钥文件的路径(默认为“~/.docker/key.pem”)
--tlsverify # 使用 TLS 并验证远程
-v, --version # 打印版本信息并退出
docker 管理命令
:- :-
docker builder 管理构建
docker buildx* Docker Buildx(Docker Inc.,v0.7.1)
docker compose* Docker Compose(Docker Inc.,v2.2.3)
docker config 管理 Docker 配置
docker container 管理容器
docker context 管理上下文
docker image 管理镜像
docker manifest 管理 Docker 镜像清单和清单列表
docker network 管理网络
docker node 管理 Swarm 节点
docker plugin 管理插件
docker scan* Docker 扫描(Docker Inc.,v0.16.0)
docker secret 管理 Docker 机密
docker service 管理服务
docker stack 管理 Docker 堆栈
docker swarm 管理群
docker system 管理 Docker
docker trust 管理对 Docker 映像的信任
docker volume 管理卷
docker images
-a, --all 显示所有镜像(默认隐藏中间镜像)
--digests 显示摘要
-f, --filter filter 根据提供的条件过滤输出
--format string 使用 Go 模板打印漂亮的镜像
--no-trunc 不要截断输出
-q, --quiet 仅显示镜像 ID
Docker 示例
Docker Web 管理工具 portainer
$ docker run -d --name portainer \
-p 8000:8000 \
-p 9443:9443 \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/portainer:/data \
portainer/portainer-ee:latest
在线代码编辑器 Code Server
$ mkdir -p ~/.config
$ docker run -it --name code-server \
-p 127.0.0.1:8080:8080 \
-v "$HOME/.config/code-server:/home/coder/.config" \
-v "$PWD:/home/coder/project" \
-u "$(id -u):$(id -g)" \
-e "DOCKER_USER=$USER" \
codercom/code-server:latest
MySQL
$ docker run --name mysql \
-p 3306:3306 \
-v $HOME/mysql/conf.d:/etc/mysql/conf.d \
-v $HOME/mysql/data:/var/lib/mysql \
-v /etc/localtime:/etc/localtime:ro \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.23
Redis
$ docker run -d --name myredis \
-v $HOME/redis/conf:/usr/local/etc/redis \
-v /etc/localtime:/etc/localtime:ro \
redis redis-server /usr/local/etc/redis/redis.conf
Nginx
$ docker run --name my-nginx \
-v "$HOME/nginx/nginx.conf:/etc/nginx/nginx.conf:ro" \
-v "$HOME/nginx/html:/usr/share/nginx/html:ro" \
-p 8080:80 \
-d nginx
PostgreSQL
$ docker run --name my-postgres \
-e POSTGRES_PASSWORD=mysecretpassword \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v $HOME/nginx/mount:/var/lib/postgresql/data \
-d postgres
媒体管理工具 Dim
$ docker run --name my-dim \
-p 8000:8000/tcp \
-v $HOME/.config/dim:/opt/dim/config \
-v $HOME/dim/media:/media:ro \
-d ghcr.io/dusk-labs/dim:dev
Gitlab
$ docker run -d --name gitlab \
--hostname gitlab.example.com \
--publish 8443:443 --publish 8081:80 -p 2222:22 \
--restart always \
--volume $HOME/gitlab/config:/etc/gitlab \
--volume $HOME/gitlab/logs:/var/log/gitlab \
--volume $HOME/gitlab/data:/var/opt/gitlab \
-v /etc/localtime:/etc/localtime \
--shm-size 256m \
gitlab/gitlab-ce:latest
Gitlab
ElasticSearch head
docker pull mobz/elasticsearch-head:5
docker create --name elasticsearch-head -p 9100:9100 mobz/elasticsearch-head:5
docker start elasticsearch-head
ElasticSearch cerebro
docker pull lmenezes/cerebro
docker run --name cerebro -p 9400:9000 --restart=always lmenezes/cerebro
docker create --name cerebro -p 9400:9000 lmenezes/cerebro
docker run --name cerebro -d -p 9400:9000 lmenezes/cerebro
docker update cerebro --restart=always
kkfileview
docker run --name kjfileview -it -p 8012:8012 --restart=always keking/kkfileview:4.1.0
Jenkins
# 拉取镜像
docker pull jenkins/jenkins
# 查看镜像
docker images
# 运行 Jenkins
# 8080 端口为 Jenkins Web 界面的默认端口 13152 是映射到外部 :前面的是映射外部
# 50000 端口为 Jenkins 的默认代理节点(Agent)通信端口 13153 是映射到外部
# --restart=on-failure:5 容器异常退出会自动重启 最大重启数为 5 次
# /var/jenkins_home 是 jenkins 工作空间目录 /www/jenkins 映射到外部
# jenkins/jenkins 是镜像名
docker run -d -u 0 --name jenkins --restart=on-failure:5 -p 13152:8080 -p 13153:50000 -v /www/jenkins:/var/jenkins_home jenkins/jenkins
docker logs 容器 ID
docker exec 容器 ID cat /var/jenkins_home/secrets/initialAdminPassword
# 重启容器
docker restart jenkins
HertzBeat
docker pull tancloud/hertzbeat
docker run -d -p 8520:1157 --name hertzbeat tancloud/hertzbeat
docker cp 9439b0606a6a:/opt/hertzbeat/config/application.yml /www/hertzbeat/
docker cp 9439b0606a6a:/opt/hertzbeat/config/sureness.yml /www/hertzbeat/
docker run -d -p 8520:1157 \
-e LANG=zh_CN.UTF-8 \
-e TZ=Asia/Shanghai \
-v /www/hertzbeat/data:/opt/hertzbeat/data \
-v /www/hertzbeat/logs:/opt/hertzbeat/logs \
-v /www/hertzbeat/application.yml:/opt/hertzbeat/config/application.yml \
-v /www/hertzbeat/sureness.yml:/opt/hertzbeat/config/sureness.yml \
--restart=always \
--name hertzbeat tancloud/hertzbeat
#停止
docker stop hertzbeat
#移除
docker rm hertzbeat
docker rm hertzbeat-collector
#重新设置启动方式
docker update --restart=always hertzbeat