Docker基础
什么是Docer
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足 的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括 VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。 参考资 料:http://dockone.io/article/6051
Docker特点
1.上手快 用户只需要几分钟,就可以把自己的程序“Docker 化”。Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心所致,代码即改” 的境界。 随后,就可以创建容器来运行应用程序了。大多数 Docker 容器只需要不到 1 秒中即可 启 动。由于去除了管理程序的开销,Docker 容器拥有很高的性能,同时同一台宿主机中也 可 以运行更多的容器,使用户尽可能的充分利用系统资源。
2.职责的逻辑分类 使用 Docker,开发人员只需要关心容器中运行的应用程序,而运维人员只需要关心如 何管 理容器。Docker 设计的目的就是要加强开发人员写代码的开发环境与应用程序要部署 的生 产环境一致性。从而降低那种“开发时一切正常,肯定是运维的问题(测试环境都是正 常 的,上线后出了问题就归结为肯定是运维的问题)”
3.快速高效的开发生命周期 Docker 的目标之一就是缩短代码从开发、测试到部署、上线运行的周期,让你的应用 程序 具备可移植性,易于构建,并易于协作。(通俗一点说,Docker 就像一个盒子,里面 可以 装很多物件,如果需要这些物件的可以直接将该大盒子拿走,而不需要从该盒子中一件 件 的取。)
4.鼓励使用面向服务的架构 Docker 还鼓励面向服务的体系结构和微服务架构。Docker 推荐单个容器只运行一个应 用 程序或进程,这样就形成了一个分布式的应用程序模型,在这种模型下,应用程序或者服 务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序 都变得非常简单,同时也提高了程序的内省性。(当然,可以在一个容器中运行多个应用程 序)
Docker组件
1.Docker 客户端和服务器
Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器 或 者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了 一 个命令行工具 Docker 以及一整套 RESTful API。你可以在同一台宿主机上运行 Docker 守 护 进程和客户端,也可以从本地的 Docker 客户端连接到运行在另一台宿主机上的远程 Docker 守护进程。
2.Docker镜像
镜像是构建 Docker 的基石。用户基于镜像来运行自己的容器。镜像也是 Docker 生命周 期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构 建出来。例如: 添加一个文件; 执行一个命令; 打开一个窗口。 也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更 新。
3.Registry(注册中心)
Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公 司 运营公共的 Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保 存自己的 镜像(说明:在 Docker Hub 下载镜像巨慢,可以自己构建私有的 Registry)。
4.Docker容器
Docker 可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容 器即 可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜 像 是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于 镜像 启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。 所以 Docker 容器就是: 一个镜像格式; 一些列标准操作; 一个执行环境。 Docker 借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker 将这个模 型 运用到自己的设计中,唯一不同的是:集装箱运输货物,而 Docker 运输软件。 和集装箱一样,Docker 在执行上述操作时,并不关心容器中到底装了什么,它不管是 web 服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将 内 容“装载”进去。 Docker 也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到 Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。 像标准集装箱一样,Docker 容器方便替换,可以叠加,易于分发,并且尽量通用。 使用 Docker,我们可以快速的构建一个应用程序服务器、一个消息总线、一套实用工 具、 一个持续集成(CI)测试环境或者任意一种应用程序、服务或工具。我们可以在本地构 建一 个完整的测试环境,也可以为生产或开发快速复制一套复杂的应用程序栈。
使用Docker做什么
容器提供了隔离性,结论是,容器可以为各种测试提供很好的沙盒环境。并且,容器本 身就具有“标准性”的特征,非常适合为服务创建构建块。Docker 的一些应用场景如下:
- 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构 建、 运行并分享 Docker 容器。容器可以在开发环境中构建,然后轻松的提交到测 试环境中,并 最终进入生产环境。
- 能够让独立的服务或应用程序在不同的环境中,得到相同的运行结果。这一点在 面向服务的架构和重度依赖微型服务的部署由其实用。
- 用 Docker 创建隔离的环境来进行测试。例如,用 Jenkins CI 这样的持续集成 工具 启动一个用于测试的容器。
- Docker 可以让开发者先在本机上构建一个复杂的程序或架构来进行测试,而不 是 一开始就在生产环境部署、测试。
Docker命令大全及Dockerfile详解(附示例)
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移 植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器化 部署已变成趋势,熟练掌握Docker的命令已经变得更加重要了。
Docker的安装
# 以Ubuntu为例
# Step 1: 移除之前docker版本并更新更新 apt 包索引
sudo apt-get remove docker docker-engine docker.io
sudo apt-get update
# Step 2: 安装 apt 依赖包,用于通过HTTPS来获取仓库
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
# Step 3: 添加 Docker 的官方 GPG 密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 4: 设置docker稳定版仓库,这里使用了阿里云仓库
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
# Step 5: 安装免费的docker Community版本docker-ce
sudo apt-get -y install docker-ce
# sudo apt-get install -y docker-ce=
# 该命令可以选择docker-ce版本
# Step 6: 查看docker版本及运行状态
sudo docker -v
sudo systemctl status docker
# Step 7:本步非必需。使用阿里云设置Docker镜像加速,注意下面链接请使用阿里云给 自己的URL
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ua3456xxx.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
# 镜像操作
# 搜索镜像:docker search + 镜像名字 $
docker search nginx
# 从registry拉取镜像:docker pull + 镜像名字:版本号 $
docker pull nginx:latest
# 从registry仓库提交镜像:docker push + 仓库名:标签 $
docker push repro1:v1.0
# 查看本地镜像: docker images $
docker images
# 使用Dockerfile创建镜像: docker build + 目录,.代表当前目录,-t表示加标签 $
docker build -t mynginx:1.0 .
# 删除一个或多个镜像: docker rmi + 镜像1 + 镜像2 $
docker rmi mynginx:1.0 mynginx:2.0
# 删除未标记或未用过的镜像 $
docker image prune
# 删除未使用过的镜像 $
docker image prune -a
# 给镜像加标记:docker tag 镜像标签 新镜像标签名 $
docker tag mynginx:1.0 nginx1
# 把镜像保存为.tar文件: docker save 镜像 > 文件$
docker save mynginx:1.0 > mynginx_v1.tar
# 从.tar文件载入镜像: docker load -i .tar文件 $
docker load -i mynginx_v1.tar
# 根据容器创建镜像:docker commit 容器名 镜像名 $
docker commit
# 容器操作
# 创建容器: docker create + 选项(-i, -t, -d, -p, -v, -e) + 镜像 $
docker create --name mynginx_1 -it -p 8080:80 mynginx:1.0
# 各选项含义
# -i:以交互模式运行容器,通常与-t 同时使用;
# -d:后台运行容器,并返回容器ID;
# -p:端口隐射, 宿主机在前,容器在后
# -t:为容器重新分配一个伪输入终端,通常与-i 同时使用;
# -v:目录挂载
# --entrypoint: 指定进入点
# --restart=always: 服务重启
# 启动容器:docker start + 容器名 $ .
docker start mynginx_1
# 创建 + 运行容器: docker run + 选项 + 镜像 + 命令 $
docker run --name mynginx_1 -it -p 8080:80 mynginx:1.0
docker run -it ubuntu /bin/bash
# 查看正在运行中的容器:docker ps $
docker ps
# 查看所有容器,包括停止运行的容器: docker ps -a $
docker ps -a
# 停止一个正在运行的容器: docker stop 容器 $
docker stop mynginx_1
# 重启容器:docker restart + 容器名 $
docker restart mynginx_1
# 容器重命名:docker rename 老名字 新名字 $
docker rename mynginx_1 mynginx_2
# 删除一个容器:docker rm 容器名 $
docker rm mynginx_1
# 强制删除一个正在运行的容器:docker rm -f 容器名$
docker rm -f mynginx_1
# 删除已停止运行的所有容器: docker container prune $
docker container prune
# 拷贝文件,从容器到宿主机:docker cp 容器名:容器内路径 宿主机文件路径 $
docker cp myweb_1:/index.html index.html
# 拷贝文件,从宿主机到容器:docker cp 宿主机文件路径 容器名:容器内路径 $
docker cp index.html myweb_1:/index.html
# 进入运行的容器,执行命令: docker exec + 选项 + 容器名 + 命令 + 参数
# 推荐大家使用 docker exec命令,因为此退出容器终端,不会导致容器的停止 $
docker exec -it mynginx_1 /bin/bash
docker exec - it mynginx_1 /bin/bash start.sh
# 查看容器端口映射:docker port 容器名 $
docker port mynginx_1
# 查看容器内已修改文件:docker diff 容器名 $
docker diff mynginx_1
# 查看容器日志:docker logs + 容器名 $
docker logs web
# 查看容器内运行进程:docker top + 容器名 $
docker top web
# 查看容器的底层信息:docker inspect + 容器名 $
docker inspect web
# 利用inspect命令查看容器的IP地址 $
docker inspect web | grep "IPAddress"
# 查看运行容器的统计数据:docker stats $
docker stats
docker python
# 基础镜像
FROM python:3.8.3-alpine
# 设置工作目录
WORKDIR /usr/src/app
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFFERED 1
# 安装psycopg2依赖
RUN apk update \ && apk add postgresql-dev gcc python3-dev musl-dev
# install dependenciesRUN
pip install --upgrade pipCOPY ./requirements.txt .RUN
pip install -r requirements.txt
# 复制entrypoint.sh
COPY ./entrypoint.sh .
# 复制项目
COPY . .
# run entrypoint.sh
ENTRYPOINT ["/usr/src/app/entrypoint.sh"]
网络操作
Docker network 是主要是用做容器之间的通信,即组建容器之间的局域网,然后加入这个 网络的容器可以使用别名(network-alias, 比如web, db)或者IP地址进行通信,就如同局域 网中主机之间的相互访问。
备注:使用-link 也可以实现容器之间简单的网络,但是容器较多而且通信关系较为复杂 时,使用network就更有条理。除此以外,官方也已经很早不建议使用-link方式进行容器互 联,-link未来可能会被删除。
Docker网络驱动模式
Docker 的网络驱动默认情况下有四个:bridge、host、overlay 和 macvlan,还有一个 特殊的网络驱动 none 用于禁止容器访问网络。
- bridge:默认的网络驱动程序。如果在创建的时候没有指定网络驱动,则默认使 用 bridge,也就是桥接网络。跟虚拟机的网络地址转换差不多,通过一个内部的子 网向容器提供 IP 和网络。
- host:容器会直接与宿主系统共享 IP 地址和网络,但是其它(例如存储,进程 命名空间和用户命名空间)相对宿主机隔离的。
- overlay:覆盖网络模式可以将不同的Dockerd守护进程连接在一起,该网络模 式支持集群容器之间相互通信,以及集群和某个单机版独立容器直接相互通信。该网 络模式使用场景比较广泛,通常集群部署时会使用该模式。
- macvlan:这个网络驱动有点像虚拟机的桥接模式,它可以让你的容器直接连接 到你的物理网络,比如连接到你的路由器,让物理网络来提供 IP 地址和网络。
- none: 禁用容器所有网络。通常与自定义网络驱动程序一起使用。
创建一个network
# mysite1-network是局域网的名字,可以自定义。默认bridge模式。 $
docker network create mysite1-network
# 利用--driver或-d指定使用bridge驱动,创建mysite2-network网络 $
docker network create –-driver bridge mysite2-network
# 查看已创建的network列表 $
docker network ls
# 查看网络详情 $
docker network inspect mysite1-network
# 将容器连接到network
# 运行新的容器,并加入到mysite1-network网络中
# --network 表示这个容器要连接到的网络
# --network-alias 表示这个容器在此网络中的名称,也可以使用--ip来指定容器的ip $
docker run --name=docker-web -d --network=mysite1-network --network-alias=web docker-web-image
# 将已经在运行的容器加入网络使用以下命令, 容器名为docker-web,别名为web $
docker network connect --alias=web --network=mysite1-network docker-web
# 连接网络时为docker-web容器指定ip地址 $
docker network connect --ip=192.10.36.122 multi-host-network docker-web
# 断开docker-web容器与mysite1-network的连接 $
docker network disconnet mysite1-network docker-web
# 删除network
# 删除mysite1-network网络 $
docker network rm mysite1-network
Docker 安装 Ubuntu
# 安装
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y
sudo usermod -aG docker
# sudo usermod -aG docker $USER
# 卸载
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
CentOS
# 安装
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
sudo yum install -y yum-utils
# 官网
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 阿里云
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io -y
sudo usermod -aG docker
# sudo usermod -aG docker $USER
# 卸载
sudo yum remove docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/container