Docker
一、什么是Docker
-
Docker 是世界领先的软件容器平台。
-
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核 提供的 CGroup 功能和 namespace 来实现的,以及 AUFS 类的 UnionFS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
-
Docker 能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。
-
用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
二、为什么要用Docker
- Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题;——一致的运行环境
- 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
- 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
- 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
- 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
- 使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署
三、Docker中的基本概念
-
镜像(Image):一个特殊的文件系统
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。
-
容器(Container):镜像运行时的实体
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
-
仓库(Repository):集中存放镜像文件的地方
镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
四、Docker常用命令
1.Docker镜像命令
- 基本命令
docker version # 查看docker版本
docker images # 查看所有已下载镜像,-q 表示仅显示镜像的id
- 拉取和删除镜像
docker search mysql # 查看mysql相关镜像 一般在拉去前先去搜索版本
docker pull mysql:5.7 # 拉取mysql镜像
docker image ls # 查看所有已下载镜像
docker rmi 镜像名称/镜像id # 删除镜像
docker rmi -f $(docker images -aq) #删除全部镜像
-
镜像加速
进入阿里云的镜像容器服务,选择镜像加速器,依次执行指令进行配置即可。
2.Docker容器命令
- 基本命令(前四条比较常用)
docker run 镜像id 新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id 删除指定容器
docker commit 容器id 提交容器成为一个新的镜像
docker start 容器id #启动容器
docker restart容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
- docker run 细节
docker run [可选参数] image | docker container run [可选参数] image
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行
-e 配置环境信息 例:-e MYSQL_ROOT_PASSWORD=123456 配置数据库密码
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
-P(大写) 随机指定端口
# 测试、启动并进入容器
➜ ~ docker run -it centos /bin/bash
如果以交互方式进入容器,可以使用一下两种方式退出
1.exit #会使得运行的容器直接退出
2.快捷键ctrl+p+q #退出但容易不停止运行
进入当前正在运行的容器
1.docker exec -it 容器id /bin/bash #进入当前容器后开启一个新的终端,可以在里面操作。(常用)
2.docker attach 容器id # 进入容器正在执行的终端
- docker ps 细节
docker ps命令 #列出当前正在运行的容器
-a, --all 显示所有容器,包括之前运行的 (默认只展示当前运行的)
-q, --quiet 只显示容器的id
- docker rm 细节
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -rf
docker rm -f $(docker ps -aq) #可以通过$来指定要删除的容器id
- docker commit 细节
docker commit 提交容器成为一个新的镜像
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
例:
docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0
五、Docker容器数据卷
Docker 中的数据卷,它能够实现宿主机与容器之间的文件共享,它的好处在于我们对宿主机的文件进行修改将直接影响容器,而无需再将宿主机的文件再复制到容器中。
- 指定路径挂载:(-v 宿主机路径:容器内路径 )
docker run -it -v 主机目录:容器内目录
➜ ~ docker run -it -v /home/ceshi:/home centos /bin/bash
#通过 docker inspect 容器id 查看元数据信息
docker volume ls 是查看不到的
- 匿名挂载:(容器内路径,在 -v只写了容器内的路径,没有写容器外的路径)
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
- 具名挂载:(卷名:容器内路径)
指定了卷名 juming-nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data 下 如果指定了目录,docker volume ls 是查看不到的(也就是除掉指定路径挂载)。
六、Dockerfile
Dockerfile 就是用来构建docker镜像的构建文件,是一个命令脚本,通过这个脚本可以生成镜像
构建步骤:
1、 编写一个dockerfile文件
2、 docker build 构建称为一个镜像
3、 docker run运行镜像
4、 docker push发布镜像(DockerHub 、阿里云仓库)
基本概念:
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行产品。
Docker容器:容器就是镜像运行起来提供服务。
实例:创建一个自己的centos
# 1.编写Dockerfile文件
vim mydockerfile-centos
FROM centos
MAINTAINER cheng<1204598429@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "-----end----"
CMD /bin/bash
# 2.通过这个文件构建镜像
# 命令 docker build -f 文件路径 -t 镜像名:[tag]
docker build -f mydockerfile-centos -t mycentos:0.1 . #注意结尾的.
在构建镜像时,如果使用默认镜像名dockerfile,则可以省略-f
CMD和ENTRYPOINT的区别:
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
追加和代替的区别:
假设有一个镜像里面有CMD ["ls","-a"] 运行它 docker run cmd-test:0.1 -l
我们的初衷是运行时想追加一个命令 -l 成为ls -al ,但是CMD的情况下 -l 替换了CMD["ls","-l"]。而-l不是命令所以会报错,但如果是ENTRYPOINT ["ls","-a"]则没有问题。
七、Docker Compose
Docker Compose 来轻松高效的管理容器,定义运行多个容器,进行批量容器编排。以前都是单个 docker run 启动容器。现在通过 docker-compose 编写 yaml配置文件、可以通过 compose 一键启动所有服务和停止。
基本流程
1、编写项目微服务
2、dockerfile 构建镜像
3、docker-compose.yaml 编排项目
4、丢到服务器 docker-compose up
下载和安装
sudo curl -L
"https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 下面这个可能快点
curl -L
https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
授权
sudo chmod +x /usr/local/bin/docker-compose
基本命令
启动 compose 项目
docker-compose up -d # -d 后台运行
停止 compose 项目
docker-compose down
重新构建 compose 项目
docker-compose up --build
待补全的知识:
Docker 网络部分,这部分等实际有用到的需求时再补上来吧~