Docker -- 应用容器

官网: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

容器镜像服务:私有镜像仓库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,176评论 5 469
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,190评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,232评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,953评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,879评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,177评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,626评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,295评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,436评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,365评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,414评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,096评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,685评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,771评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,987评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,438评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,032评论 2 341

推荐阅读更多精彩内容