Docker 镜像和容器
1. 安装配置
1.1 安装
# 卸载
sudo apt remove docker docker-engine docker.io# docker.io: Debian 团队维护
sudo apt install docker.io# docker-ce: 官方社区版
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
apt-cache madison docker-ce
sudo apt install docker-ce=<VERSION># 免 sudo,重新登录后生效
sudo usermod -aG docker $USER
sudo systemctl restart docker# 二进制包
https://download.docker.com/linux/static/stable
1.2 启动配置
mkdir -p /etc/dockercat > /etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2","storage-opts": ["overlay2.override_kernel_check=true"],"insecure-registries" : [ "192.168.80.250:5000" ]
}
EOF
1.3 支持代理
mkdir -p /etc/systemd/system/docker.service.dcat > /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="ALL_PROXY=socks5://192.168.31.20:1080/"
Environment="NO_PROXY=localhost,127.0.0.1,docker.io,hub.elihe.io,pvjhx571.mirror.aliyuncs.com"
EOFsystemctl daemon-reload && systemctl restart docker
1.4 远程访问
vi /etc/docker/daemon.json
{"hosts": ["tcp://0.0.0.0:2357", "unix:///var/run/docker.sock"]
}# -H, --host
docker -H 192.168.31.41 network show
2. 镜像管理
2.1 基本操作
docker imagesdocker search nginx
docker pull nginx
docker rmi nginxdocker tag nginx nginx:v0.1
docker push nginx:v0.1docker history nginx:v0.1docker image prune # 清理 dangling 镜像
docker image prune -a # 清理所有没有关联容器的镜像
2.2 容器和镜像
export/import:容器文件化
save/load: 镜像文件化
commit: 容器镜像化
# image => file => image
docker save -o nginx.tar nginx
docker load -i nginx.tardocker run --name nginx-server -p 8080:80 -d nginx
# docker exec -it nginx-server /bin/bash
root@02d9c2b750f6:/# echo "<h1>hello docker</h1>" > /usr/share/nginx/html/hello.html# container => file => image
docker export -o nginx-server.tar nginx-server
docker import nginx-server.tar nginx:v0.2# container => image
docker commit -p nginx-server nginx:v0.3 # -p, --pause
使用场景:
save & load
: 适合docker-compose.yml
编排的组合镜像,进行离线的迁移export & import
: 适合在基础镜像启动的容器中,安装了其他软件或服务后,将该容器导出,形成一个新的镜像。
文件的区别:
save
: 是一个 docker 分层文件系统, 因为它由一层层文件系统叠加起来,存在很多重复的文件,所以较大export
: 是一个 Linux 系统文件目录
2.3 构建镜像
2.3.1 Dockerfile 指令
FROM: 指定基础镜像
- 服务类镜像:
nginx
、redis
、mongo
、mysql
、httpd
、php
、tomcat
- 语言类镜像:
node
、openjdk
、python
、ruby
、golang
- 操作系统镜像:
ubuntu
、debian
、centos
、fedora
、alpine
- 空白镜像:
scratch
适用于静态编译的程序,不需要操作系统支撑。
- 服务类镜像:
MAINTAINER:
COPY: 复制文件
ADD: 支持添加URL,自动解压文件等
WORKDIR: 指定默认目录工作
RUN: 构建镜像时执行, 用于安装应用和软件包,创建用户等操作
ENTRYPOINT: 运行容器的入口命令, 但支持额外参数
CMD: 运行容器的启动命令。如果没有定义 ENTRYPOINT, CMD 将作为它的 ENTRYPOINT;如果定义了 ENTRYPOINT 的话,CMD 只为 ENTRYPOINT 提供参数;CMD 可由 docker run 后的命令覆盖,同时覆盖参数
ENV: 设置环境变量
VOLUME: 定义匿名卷
EXPOSE: 曝露端口
USER:指定当前用户
HEALTHCHECK
2.3.2 scratch镜像
golang程序:静态编译
mkdir -p scratch && cd $_cat > hello.go <<EOF
package main
import "fmt"func main() {fmt.Println("hello world")
}
EOFcat > Dockerfile <<EOF
FROM golang as builder
WORKDIR /go/src/app
COPY hello.go .
RUN go build -ldflags="-w -s" hello.goFROM scratch
COPY --from=builder /go/src/app/hello /
CMD ["/hello"]
EOFdocker build -t hello .
docker run --rm hello
2.3.3 示例:构建Nginx镜像
$ mkdir -p nginx && cd $_$ vi index.html
<h1>hello world!</h1>$ vi entrypoint.sh
#!/bin/shcat > /etc/nginx/conf.d/default.conf <<EOF
server {listen ${IP:-0.0.0.0}:${PORT:-80};server_name $HOSTNAME;location / {root ${WEB_ROOT:-/usr/share/nginx/html};index index.html index.htm;}
}
EOFexec "$@"
#+++++++++++++++++++++++++++++++++++++++++++$ vi Dockerfile
FROM nginx:1.19.2-alpine
LABEL maintainer="eli.he@live.cn"ENV WEB_ROOT="/data/www/html/"
WORKDIR $WEB_ROOTADD index.html ./
ADD entrypoint.sh /bin/RUN chmod +x /bin/entrypoint.sh
EXPOSE 80/tcp
HEALTHCHECK --start-period=3s CMD curl -o - -q http://${IP:-0.0.0.0}:${PORT:-80}CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
#+++++++++++++++++++++++++++++++++++++++++++$ docker build -t web:1.0 .
$ docker run -p 8080:80 -d web:1.0
2.3.4 易错点
错误的文件系统操作
在 Shell 中,连续两行是同一个进程执行环境,因此前一个命令修改的内存状态,会直接影响后一个命令;而在 Dockerfile 中,这两行 RUN 命令的执行环境根本不同,是两个完全不同的容器。
RUN cd /app RUN echo "hello" > world.txt # 文件并不在/app目录下
docker中的进程,必须以前台方式启动
对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其它辅助进程不是它需要关心的东西。
CMD echo $HOME CMD ["sh", "-c", "echo $HOME"] # 实际执行命令# 错误的示范 CMD service nginx start CMD ["sh", "-c", "service nginx start"] # 实际执行命令# 正确的nginx启动命令, 必须以前台形式运行 CMD ["nginx", "-g", "daemon off"]
支持额外参数
CMD ["curl", "-s", "https://cip.cc"] # 不主持额外参数 ENTRYPOINT ["curl", "-s", "https://cip.cc"] # 支持额外参数,docker run --rm myip -i 获取HTTP请求头,但这里报错,无法将该参数传入
2.4 特殊镜像
2.4.1 虚悬镜像
仓库名、标签均为 的镜像 (docker pull/build 时,原有的镜像名被占用,会导致此种情况)
$ docker images -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 06ebe39c8aee 11 minutes ago 22.1MB
<none> <none> 62c8bc68a9ed 33 minutes ago 942MB$ docker image prune # 删除虚悬镜像
2.4.2 中间层镜像
为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像
$ docker images -a
3. 容器管理
3.1 基本操作
docker create --name myweb -p 8080:80 nginx
docker start myweb
docker stop myweb
docker pause myweb
docker unpause mywebdocker ps
docker kill myweb
docker rm myweb# Ctrl+P Ctrl+Q 切换到后台运行, 变成守护式容器
docker run --name test -it busybox /bin/sh
docker attach test # Attach local standard input, output, and error streams to a running container, exit后,容器自动停止# 守护式容器, 适合有常驻进程的镜像
docker run --name myweb -p 8080:80 -d nginx
docker exec -it myweb /bin/shdocker logs -tf --tail=10 myweb # 查看容器日志. -f --follows, -t --timestamps
docker inspect mywebdocker port myweb
docker top myweb # 容器进程
docker stats myweb # 实时监控,相当于进入容器执行 top# 宿主机与容器的文件拷贝
docker cp myweb:/usr/share/nginx/html/50x.html .
docker cp index.html myweb:/usr/share/nginx/html/
3.2 资源限制
docker run --cpu-shares=512 # -c, 50% CPU, 1024 means 100% of the CPU
docker run --cpuset-cpus=0,2,4 # 使用0,2,4三个 CPUdocker run --memory 300M # -m
3.3 访问宿主机
# Mount a FUSE based fs
docker run --rm -it --cap-add SYS_ADMIN --device /dev/fuse sshfs# give access to a single device
docker run -it --device=/dev/ttyUSB0 ubuntu /bin/sh# 获取宿主机root权限
docker run -it --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu /bin/sh
3.4 容器诊断
# 保存案发现场
docker commit 05dd6f84ddf9 user/debug# 以命令行方式启动
docker run -it --rm user/debug /bin/shdocker run --rm --entrypoint="" grafana/grafana:latest /bin/sh -c 'cat /etc/passwd | grep grafana'
3.5 容器自动启动
# 创建容器时
docker run --restart=always# 容器运行时更新
docker update --restart=always 07fb7442f813
--restart
参数值:
- no: 不自动重启,默认值
- on-failure: 容器错误退出,即退出码不为0时,重启容器
- always:容器停止,自动重启。如果手动停止,需要重启dockerd进程或者重启容器本身才生效。主要用于宿主机重启后,自动启动容器
- unless-stopped:同always,但当手动停止,即使重启dockerd进程,也无法自动启动容器
4. 资源清理
docker kill $(docker ps -aq)docker rm $(docker ps -aq)
docker rm -v $(docker ps -aq -f status=exited) # 删除所有已退出的容器
docker rm -v $(docker ps -aq -f status=dead) # 删除所有状态为dead的容器docker rmi $(docker images -q)
docker volume rm $(docker volume ls -q)
docker volume rm $(docker volume ls -qf dangling=true) # 删除所有未被容器引用的卷docker system df # 存储统计
docker system df -v
docker system prune # 空间自动清理
docker system prune -a # 一并清除所有未被使用的镜像和悬空镜像
docker system prune -f
docker images -f dangling=true # 悬空镜像
5. 常用镜像
docker pull mysql:5.7
docker run --name mysql-server -p 3306:3306 -v /data/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7docker pull redis:6.0.10
docker run --name reids-server -p 6379:6379 -d redis:6.0.10docker pull elasticsearch:7.16.3
docker run --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.16.3
6. 使用技巧
6.1 输出控制
$ docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"
CONTAINER ID NAMES PORTS
6c30d12fadaf nexus3 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp
名称 | 含义 |
---|---|
.ID | 容器ID |
.Image | 镜像ID |
.Command | 执行的命令 |
.CreatedAt | 容器创建时间 |
.RunningFor | 运行时长 |
.Ports | 暴露的端口 |
.Status | 容器状态 |
.Names | 容器名称 |
.Label | 分配给容器的所有标签 |
.Mounts | 容器挂载的卷 |
.Networks | 容器所用的网络名称 |
Docker 镜像和容器相关推荐
- [watchtower] 自动更新 Docker 镜像与容器
自动更新 Docker 镜像与容器 pull镜像 运行 更新docker镜像 参数解释 更新镜像列表文件 pull镜像 根据自己的系统架构选择,都是为最新版镜像 docker pull contain ...
- Docker学习二:Docker镜像与容器
前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...
- docker镜像和容器的导出导入
docker镜像的导出和导入 docker镜像和容器的导入导出,用于迁移.备份.升级等场景.主要用到export.import.save.load四个方法. 显示当前docker中的镜像: docke ...
- Docker、nvidia-container-toolkit安装与常用docker命令及docker镜像和容器的更新维护
Python的virtual env和Anaconda的env可以用来做环境隔离防止不同的模型环境之间在安装时相互影响甚至因为支持包的版本冲突导致不能同时使用,但是不具备打包发布部署的功能,想要调试好 ...
- 安装docker与docker镜像和容器基本的基本操作
安装docker与docker镜像和容器基本的基本操作 前言 一.docker安装步骤详解 二.网络优化 三.Docker-server端配置文件建议配置 四.Doceker基本命令(运维) (1)查 ...
- Docker镜像与容器基本操作
Docker镜像与容器基本操作 一.Docker基本命令 1.查看docker版本 2.搜索镜像和dockerhub 3.下载镜像 4.docker run 5.查看所有状态容器 二.docker镜像 ...
- Docker镜像和容器
docker镜像与容器概念 本文转载自:https://www.cnblogs.com/bethal/p/5945038.html 本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面 ...
- docker 一起性重启所有镜像_docker系列四之docker镜像与容器的常用命令
docker镜像与容器的常用命令 一.概述 docker的镜像于容器是docker中两个至关重要的概念,首先给各位读者解释一下笔者对于这两个概念的理解.镜像,我们从字面意思上看,镜子里成像,我们人站在 ...
- docker镜像及容器的使用
docker镜像及容器的使用 一.Docker三大概念 docker 中有三个核心概念:镜像,容器,仓库. 因此准确把握这三大概念对于掌握docker技术尤为重要. 1.镜像 Docker镜像就相当于 ...
- (五)Docker镜像和容器
之所以在之前没有讲什么是镜像和容器是因为如果你没有一个最初的认识,那么你就很难理解镜像和容器以及它们的区别.我相信在前面一章中的讲述中,你应该稍有体会容器是基于镜像构建的,同时构建了容器之后如果不删除 ...
最新文章
- Python 列表、字典、元组的一些小技巧
- windows c语言判断是不是nan,C++ 判断浮点数是否为Nan值
- 第十五周项目1-打入“内部”寻“内幕”
- c语言 ctype,C语言标准库系列之 -
- 【机器学习】使用集成学习回归器改善预测模型的得分
- [译文]C# Heap(ing) Vs Stack(ing) in .NET: Part I
- 数学专业考研及读研目录[2014年11月7日更新]
- 三月份总结(后台规范+面试)
- vue和微信小程序的区别、比较
- HDU - 1087
- heart beat 安装与配置
- pytorch中RNN注意事项(关于input和output维度)
- C语言判断文件编码格式
- 【老生谈算法】matlab遗传算法工具箱源码——遗传算法
- 苹果谷歌微软薪酬大揭秘,最高320万元!
- 苏州数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型
- html梯形选项卡,梯形标签页
- 部署web项目在腾讯云当中
- 【31】GPU(下):为什么深度学习需要使用GPU?
- 波特Baud、码元、比特bit三者关系+ Byte、bps、Bps