官网:https://www.docker.com
Docker仓库:https://hub.docker.com/
历史:美国提供PaaS服务的dotCloud公司,于2013年开源了容器引擎Docker,而后公司改名为Docker Inc。
优势:1、屏蔽主操作系统差异;2、一处制作镜像,多处运行;3、比操作系统镜像轻量
使用场景:私有化部署
概念
LXC:Linux Container,Linux容器技术
Docker Daemon:docker 守护进程,用于管理Docker镜像和Docker容器
Libcontainer:是一个容器引擎,被Docker Daemon调用
Docker 仓库:存放Docker镜像的地方
Docker 镜像:Docker容器的镜像,一个镜像由多个层级组成,一个通用层级可以被多种镜像共用,上层镜像的文件将覆盖下层镜像的同目录同名的文件
Docker 容器:在隔离空间里运行的应用及其依赖(包括虚拟的操作系统和库)
Docker容器与虚拟机的对比
虚拟机架构:主操作系统 -> 虚拟机管理系统Hypervisor -> 从操作系统 -> 应用及其依赖
Docker架构:主操作系统 -> 容器引擎 -> 应用及其依赖
1、Docker架构更轻量
2、Docker镜像更轻量,迁移简单
Linux安装
1、yum install docker 或 apt install docker.io
2、启动Docker守护进程:service docker start
原理
容器技术 = Cgroup + Namespace + rootfs + 容器引擎
Cgroup:control group(控制组),内核提供的特性,用于限制和隔离一组进程对系统资源的使用
Namespace:系统资源访问隔离
rootfs:文件系统隔离
容器引擎:生命周期控制
Docker 镜像
查找镜像:docker search mysql
下载镜像:docker pull mysql
查看已下载的镜像:docker images
查看镜像详细信息:docker inspect mysql
删除镜像:docker rmi mysql
把镜像存成文件:docker save -o mysql.tar mysql
载入镜像文件:docker load < mysql.tar
Docker 容器
执行容器里的命令:docker run ubuntu /bin/echo 'hello world' # 容器名称后面是容器里的命令
创建容器,指定名称:docker run --name 容器名称 mysql
创建容器,保存容器终端打开:docker run -t -i ubuntu /bin/bash # -t 表示打开容器终端,-i 表示保持终端输入
创建容器,后台运行容器:docker run -d nginx
创建容器,端口映射:docker run -d -p 本地端口:容器端口 mysql
创建容器,随机端口映射:docker run -d -P mysql
创建容器,指定数据卷:docker run -d -v /temp/data mysql # 数据卷 即 容器存放数据的地方
创建容器,目录映射:docker run -d -v 本地目录:容器目录 mysql
创建容器,容器互联:docker run -d -P --name 容器2 --link 容器1 mysql
创建容器时指定的容器名、端口映射、目录映射不能被改变,可以先commit成新的镜像,再run重新指定
退出并停止容器:exit
退出但不停止容器:Ctrl+P+Q
进入后台运行的容器:docker attach 容器ID
进入后台运行的容器并新起shell:docker exec -ti 容器ID /bin/bash
执行容器里的命令:docker exec 容器ID bash -c "cd /mnt && python /mnt/xx.py"
查看所有容器:docker ps -a
查看终止状态的容器:docker ps -a -q
查看容器输出:docker logs 容器ID
查看端口映射:docker port 容器ID 容器端口
查看容器详细信息:docker inspect 容器ID
拷贝文件:docker cp index.html 容器ID:/usr/nginx/html
终止容器:docker stop 容器ID
重启容器:docker restart 容器ID
启动终止状态的容器:docker start 容器ID
删除容器:docker rm 容器ID
导出容器:docker export 容器ID >ubuntu.tar
导入容器文件为镜像:cat ubuntu.tar | docker import - 镜像名称:镜像tag
基于容器创建镜像:docker commit -m "备注信息" -a "作者" 容器ID 镜像名称
使用宿主机网络:docker run 时带上 --network host,与-p不同用
查看已有网络:docker network ls
创建网络:docker network create -d bridge my-bridge
把容器添加到网络:docker network connect --alias 容器在网络中的代号 my-bridage 容器ID
把容器从网络移除:docker network disconnect my-bridage 容器ID
一般用network进行容器互联,而非--link;一般要新建网络,而非使用容器的默认网络,因为默认网络中不能给容器指定--alias
清理空间:docker system prune
制作镜像
方式一:从Docker官方的基础镜像开始,用Dockerfile一步步搭建起镜像
方式二:先手动搭建起应用容器,再把容器打包成镜像并上传;再以该镜像为基础,用Dockerfile改变镜像
对比:方式二需要将自己的应用镜像提交到docker hub,涉及保密问题;方式一更灵活,修改Dockerfile即可改变镜像;方式二要下载的镜像比较大,而方式一中基础镜像上安装的软件,一次安装后就会在主操作系统中缓存,再次安装无需下载。
1、编写 Dockerfile
FROM tomcat # 本地已有的一个镜像作为 基础镜像
WORKDIR /usr # 指定工作目录,即cd到这个目录
MAINTAINER Hogen xx@126.com # 维护人信息
ADD ~/ /app # 将本地或网上文件 添加到 容器内
COPY ~/xx.war /usr/local/tomcat/webapps # 复制本地文件到容器内
RUN echo 'Hello world' # 构建镜像时执行
CMD echo 'Hello world' # 启动容器时(非创建镜像时)执行
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] # 入点,启动容器时执行,会覆盖CMD
EXPOSE 80 # 暴露端口
.dockerignore 文件里可以指明需要被Dockerfile忽略的文件
2、构建:docker build -t xx:lastest ./ # -t 指定tag,./ 查找当前目录下的所有dockerfile
3、查看:docker images
常用开源Dockerfile:https://github.com/dockerfile
案例:制作nginx环境的镜像
最佳实践:一个系统的不同组件放到不同镜像里,有现成的镜像就用现成的镜像。因为docker的操作系统镜像较为轻量,要自己安装软件往往缺少很多依赖
1、安装docker: yum install docker
2、启动docker: service docker start
3、下载nginx镜像:docker pull nginx
4、新建前端代码存放路径:mkdir /usr/myApp
5、启动容器:docker run --name nginx -v /usr/myApp:/usr/share/nginx/html -p 80:80 -d nginx
6、把前端构建产物上传到 /usr/myApp
7、获取default.conf(被nginx.conf引用):docker cp nginx:/etc/nginx/conf.d/default.conf ./default.conf
8、修改 default.conf
9、重置default.conf:docker cp ./default.conf nginx:/etc/nginx/conf.d/
10、重启容器:docker restart nginx
案例:制作java环境镜像
主操作系统中
1、安装docker: yum install docker
2、启动docker: service docker start
3、安装centos:docker pull centos
4、启动容器,命名为java:docker run -tdi --name java centos /usr/sbin/init # 用init方式启动,才能使用service;必须带-d,否则会卡死
5、进入容器:docker exec -ti java /bin/bash # 用init方式启动的容器,必须新起shell进入,不能用attach
容器中
6、安装JDK:yum install -y java-1.8.0-openjdk
主操作系统中
7、上传项目构建出来的jar包
8、将jar包复制到容器:docker cp ./app.jar java:/root
容器中
9、启动java程序:java -jar /root/app.jar --spring.profiles.active=docker
案例:制作mysql镜像
主操作系统中
1、安装docker: yum install docker 或 apt install docker.io
2、启动docker: service docker start
3、下载mysql镜像:docker pull mysql
4、创建mysql容器:docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=*** -d mysql
5、进入容器:docker exec -it mysql /bin/bash
容器中
6、登录mysql:mysql -uroot -p
7、创建仓库:create database myApp;
主操作系统中
8、上传初始化sql
9、将初始化sql拷贝到容器:docker cp dump.sql mysql:/root
容器中
10、导入初始化sql:mysql -u root -p myApp < dump.sql
CI / CD 实践方案
gitlab 触发 Jenkins 打 Docker 镜像,上传到自建的镜像仓库,由Ansible / Chef 控制目标机下载镜像,关闭老容器实例,创建新容器实例
阿里云
容器服务 Container Service
弹性容器实例 ECI
容器镜像服务:私有镜像仓库