Docker
- 1. Docker简介
- Docker中的基本概念
- Docker的应用场景
- Docker的优点
- 1. 快速、一致地交付应用程序
- 2. 响应式部署和扩展
- 3. 在同一硬件上运行更多工作负载
- 2. Docker的架构
- 3. Docker镜像加速
- Ubuntu14.04、Debian7Wheezy配置镜像加速
- Ubuntu16.04+、Debian8+、CentOS7
- 检查加速器是否生效
- 4. 使用Docker
- Docker Hello World
- 以交互式的方式启动容器
- 以后台模式启动容器
- last. Docker常用指令
- 1. 显示容器的全部信息
- 2. 查看某个容器的详细信息
- 3. 以终端的方式进入容器
- 4. 查看容器内的标准输出
- 5. 停止容器
- 6. 查看docker客户端的所有命令选项
- 7. 查看具体的docker命令的使用方法
- 8. 启动容器时指定容器的名称
- 9. 启动已停止的容器
- 10. 获取镜像
- 11. 停止一个容器
- 12. 列出镜像
- 13. 查找镜像
- 14. 删除镜像
- 15. 创建镜像
- 15.1 当从docker镜像仓库拉取的镜像无法满足我们的需求时
- 15.1.1 更新镜像
- 15.1.2 构建镜像
- 16. 设置镜像标签
1. Docker简介
Docker
是一个开源的应用容器引擎,基于Go
语言并遵从Apache2.0
协议开源。Docker
可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到Linux
机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker并非是一个通用的容器工具,它依赖于已存在并运行的Linux内核环境。
Docker实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux
主机。
Docker中的基本概念
- Registry
- 定义:存储和分发Docker镜像的服务,包括官方的Docker Hub、私有的或第三方的Registry。
- 作用:Registry允许用户上传、存储和检索Docker镜像,用户可以通过
docker push
和docker pull
命令与Registry交互。 - 类型:
* 官方Registry(Docker Hub):这是默认的公共Registry,可以在此找到大量的公共镜像。
* 私有Registry:企业或个人可以搭建自己的私有Registry,用于内部使用。
* 第三方Registry:第三方提供的Registry服务,如阿里云Docker Registry、Google Container Registry等。
- Repository
- 定义:Repository是一个命名空间,用于组织和管理一组相关的Docker镜像。每个Registory可以包含多个不同标签(tag)的镜像版本。
- 作用:Repository允许用户针对特定的应用程序或服务组织多个版本的镜像。例如,一个名为nginx的repository可能包含了多个版本的Nginx镜像,如nginx:latest,nginx:1.15.12等。
- 结构:Repository通常以registry/repository的形式表示,例如docker.io/libary/nginx表示Docker Hub上的nginx Repository。
- Image(镜像):Image相当于一个root文件系统,比如官方镜像ubuntu:16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
- Container(容器):Container是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
镜像和容器的关系就像面向对象程序设计中类和实例的一样。
Docker的应用场景
- Web应用的自动化打包和发布
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其它的后台应用。
- 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
Docker的优点
1. 快速、一致地交付应用程序
Docker
允许开发人员使用提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。容器非常适合持续集成和持续交付(CI/CD)工作流程。
2. 响应式部署和扩展
Docker
是基于容器的平台,允许高度可移植的工作负载。Docker容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker
的可移植性和轻量级的特性,还可以轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。
3. 在同一硬件上运行更多工作负载
Docker
轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案。Docker非常适合于高密度环境以及中小型部署,可以用更少的资源做更多的事情。
2. Docker的架构
Docker为典型的C/S架构模式,使用远程API来进行一系列的操作。
3. Docker镜像加速
- 科大镜像:https://docker.mirrors.ustc.edu.cn/
- 网易:https://hub-mirror.c.163.com/
- 阿里云:https://<你的ID>.mirror.aliyuncs.com
- 七牛云加速器:https://reg-mirror.qiniu.com
。。。。。。
配置了某个加速器地址后,如果拉取不到镜像,切换另一个重试。可以多配置几个镜像,如果有不能使用的,会自动切换到可以使用的镜像拉取
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:
Ubuntu14.04、Debian7Wheezy配置镜像加速
对于使用upstart的系统而言,编辑/etc/default/docker文件,在其中的DOCKER_OPTS中配置加速器地址:
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
重新启动服务:
sudo service docker restart
Ubuntu16.04+、Debian8+、CentOS7
对于使用systemd的系统,在/etc/docker/daemon.json中写入如下内容(如果文件不存在新建即可)
{"registry-mirrors":["https://reg-mirror.qiniu.com/"]}
重新启动服务
sudo systemctl daemon-reload
sudo systemctl restart docker
检查加速器是否生效
docker info 输出如下信息说明配置成功:
Registry Mirrors:https://reg-mirror.qiniu.com
4. 使用Docker
Docker Hello World
使用docker run
命令启动一个容器。
docker run ubuntu:15.10 /bin/echo 'hello world'
指令解释:以ubuntu:15.10镜像创建一个新容器,然后在容器中执行/bin/echo 'hello world'。如果不指定镜像的tag,docker将会使用标签为latest的镜像
以交互式的方式启动容器
docker run -i -t ubuntu:15.10 /bin/bash
参数说明:
- -i:使容器的标准输入保持打开,允许与容器进行交互
- -t:在新容器内指定一个伪终端或终端
- /bin/bash:指定启动容器时要运行的命令。/bin/bash即启动一个Bash shell
执行这条命令docker会做以下几件事情:
1.拉取镜像:如果本地没有Ubuntu 15.10的镜像,Docker会从Docker Hub下载这个镜像
2.启动镜像:使用指定的镜像启动一个新的容器
3.进入Bash shell:在容器内启动一个交互式的Bash shell
可以使用exit
或CTRL + D
来退出容器
以后台模式启动容器
docker run -d ubuntu:15.10 /bin/sh -c 'while true; do echo hello world; sleep 1; done'
指令解释:启动一个后台运行的Ubuntu 15.10容器,并在容器内执行一个循环命令,每隔一秒输出一次'hello world'
参数解释
- -d:在后台运行容器,不会阻塞当前终端
- /bin/sh -c:-c表示后面跟着的字符串将作为命令执行
last. Docker常用指令
1. 显示容器的全部信息
docker ps -a --no-trunc
CONTAINER_ID:容器ID
IMAGE:使用的镜像
COMMAND:启动容器时运行的命令
CREATED:容器的创建时间
STATUS:容器的状态
容器的状态分为以下几种
- created 已创建
- restarting 重启中
- running或Up 运行中
- removing 迁移中
- paused 暂停
- exited 停止
- dead 死亡
PORTS:容器的端口信息和使用的连接类型(tcp/udp)
NAMES:自动分配的容器名称
2. 查看某个容器的详细信息
docker inspect containerId
3. 以终端的方式进入容器
docker attach containerId
注:如果从容器退出,会导致容器停止
docker exec -it containerId /bin/bash
4. 查看容器内的标准输出
docker logs containerName/containerId
5. 停止容器
docker stop containerName/containerId
6. 查看docker客户端的所有命令选项
docker
7. 查看具体的docker命令的使用方法
docker command --help
8. 启动容器时指定容器的名称
docker run -itd --name ubuntu-test ubuntu /bin/bash
通过--name指定容器的名称
9. 启动已停止的容器
docker start containerId
10. 获取镜像
docker pull imageName
11. 停止一个容器
docker stop containerId
12. 列出镜像
docker images输出信息说明:
* REPOSITORY:镜像的仓库源
* TAG:镜像的标签
* IMAGE ID:镜像ID
* CREATED:镜像的创建时间
* SIZE:镜像的大小
13. 查找镜像
可以从[Docker Hub](https://hub.docker.com/)
网站来搜索镜像,也可以使用docker search
命令来搜索镜像。
docker search imageName
输出信息解释
- NAME:镜像的名称
- DESCRIPTION:镜像的描述
- OFFICIAL:是否docker官方发布
- STARS:类似Github里面的star
- AUTOMATED:自动构建
在Docker中,自动构建镜像指的是使用脚本或工具自动构建Docker镜像的过程,这一过程通常是在CI/CD(持续集成/持续部署)流程中实现的。
自动构建镜像的方式
- 使用
Dockerfile
:
- 定义:
Dockerfile
是一个文本文件,其中包含了构建镜像所需的一系列指令。- 构建:通过运行
docker build
命令并指定Dockerfile
的位置,Docker会根据Dockerfile
中的指令逐步构建镜像。
- 使用CI/CD工具:
- 定义:CI/CD工具(如Jenkins, GitHub Actions, GitLab CI/CD, CircleCI等)可以在代码提交到仓库后自动触发构建流程。
- 构建:这些工具可以根据预定义的配置文件(如.gitlab-ci.yml, Jenkinsfile, github/workflows/*.yml等)自动构建Docker镜像,并将其推送到Docker注册表中。
.gitlab-ci.yml的相关内容参考
自动构建镜像的好处
- 可重复性:每次构建都使用相同的指令,保证了镜像的一致性。
- 自动化:减少了手动构建镜像的需要,节省了时间和精力。
- 版本控制:
Dockerfile
可以被纳入版本控制系统,方便跟踪和回滚更改。- 易于集成:可以轻松地与其他CI/CD工具集成,实现自动化部署。
- 标准化:有助于实现标准化的开发和部署流程。
14. 删除镜像
docker rmi containerName
15. 创建镜像
15.1 当从docker镜像仓库拉取的镜像无法满足我们的需求时
可以通过以下两种方式对镜像进行更改
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用
Dockerfile
指令来创建一个新的镜像
15.1.1 更新镜像
(1)进入容器,更新系统包
apt-get update
apt-get upgrade -y
(2)使用exit
命令退出容器
(3)通过命令docker commit
来提交容器副本
docker commit -m ='' -a='' containerId 要创建的镜像名(无需引号)[如docker-test/ubuntu:version10000]
- -m:提交的描述信息
- -a:指定镜像作者
通过docker images
可以看到本地镜像仓库中多了docker-test/ubuntu:version10000
15.1.2 构建镜像
使用命令docker build
从零开始创建一个新的镜像。需要创建一个Dockerfile
文件,其中包含一组指令告诉Docker如何构建镜像。
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
内容解释
- FROM centos:6.7
- 基础镜像:使用 centos:6.7 作为基础镜像。
- MAINTAINER Fisher “fisher@sudops.com”
- 维护者信息:指定 Docker 镜像的维护者信息。
- RUN /bin/echo ‘root:123456’ | chpasswd
- 设置 root 用户密码:使用 chpasswd 命令设置 root 用户的密码为 123456。
- RUN useradd runoob
- 添加用户:创建一个名为 runoob 的新用户。
- RUN /bin/echo ‘runoob:123456’ | chpasswd
- 设置 runoob 用户密码:使用 chpasswd 命令设置 runoob 用户的密码为 123456。
- RUN /bin/echo -e "LANG=“en_US.UTF-8"” >/etc/default/local
- 设置语言环境:设置系统的默认语言环境为 en_US.UTF-8。
- EXPOSE 22
- 暴露端口:声明容器将监听 SSH 服务的默认端口 22。
- EXPOSE 80
- 暴露端口:声明容器将监听 HTTP 服务的默认端口 80。
- CMD /usr/sbin/sshd -D
- 启动命令:定义容器启动时执行的命令。这里启动 sshd 服务并使其在后台运行。
每一条指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写
docker build -t 要创建的目标镜像名 Dockerfile文件位置(如果为. 则表示使用当前目录下的Dockerfile)
16. 设置镜像标签
docker tag imageId userName/repository:tag