Docker入门
来源:互联网 发布:ubuntu系统下安装win7 编辑:程序博客网 时间:2024/06/03 19:30
Docker入门
为什么要使用 Docker?
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。
因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,
因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。
而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码在我机器上没问题啊” 这类问题。
持续交付和部署
对开发和运维(DevOps) 人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。
开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,
而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,
甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,
迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,
基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,
既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
对比传统虚拟机总结
安装
yum -y install docker-engine
基本概念
Docker 包括三个基本概念
镜像(Image)
容器(Container)
仓库(Repository)
镜像、容器基本命令
docker命令
docker --help
搜索镜像
docker search java
拉取镜像
拉取最新的nginx镜像
docker pull nginx
拉取标签为7的tomcat镜像
docker pull tomcat:7
列出镜像
docker images
删除镜像
docker rmi nginx:v1docker rmi $(docker images -q redis)
构建镜像
创建Dockerfile文件
mkdir mynginxcd mynginxtouch Dockerfile
其内容为:
FROM nginxRUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
构建镜像
docker build -t nginx:v1 .
创建和启动容器
docker run --name web1 -d -p 8080:80 nginx:v1
8080端口访问
curl localhost:8080
列出正在运行的容器
docker ps
列出所有的容器
docker ps -a
启动容器
docker start web1
停止容器
docker stop web1
删除容器
docker rm web1
删除所有容器
docker rm $(docker -a -q)
查看容器日志
docker logs web1
查看容器映射端口
docker port tomcatcompose_weba_1
RUN 常用参数
-t 选项让Docker分配一个伪终端(pseudo-tty) 并绑定到容器的标准输入 上
-i 则让容器的标准输入保持打开
-d 后台运行
-p 映射端口
-P 随机映射端口
–name 指定容器名称
–rm 退出后自动删除
-v 挂载数据卷
创建debine容器,进入交互式系统,退出后自动删除容器
docker run -t -i --rm debine /bin/bash
创建名称为web1 端口映射8080后台运行的nginx容器
docker run --name web1 -p 8080:80 -d nginx:v1
指定IP指定端口
run --name web1 -p 127.0.0.1:8080:80 -d nginx:v1
常用Dockerfile 指令
COPY 复制
COPY package.json /usr/src/app/
<源路径> 可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则,如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
ADD 高级复制
ADD 指令和 COPY 的格式和性质基本一致。
但是在 COPY 基础上增加了一些功能(如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip , bzip2 以及xz 的情况下,
ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去)。
这个功能其实并不实用,而且不推荐使用
ENTRYPOINT入口
当指定了 ENTRYPOINT 后, CMD 的含义就发生了改变,
不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为: <ENTRYPOINT> "<CMD>"
如:容器myip
FROM debianRUN apt-get update \ && apt-get install -y curl \ && rm -rf /var/lib/apt/lists/*ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
-i传递给curl
docker run myip -i
CMD 容器启动命令
CMD echo $HOME
在实际执行中,会将其变更为:
CMD [ "sh", "-c", "echo $HOME" ]
ENV环境变量
ENV NODE_VERSION 7.2.0RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
下列指令可以支持环境变量:
ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD。
VOLUME 定义匿名卷
VOLUME [“<路径1>”, “<路径2>”…]
VOLUME <路径>
为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。
当然,运行时可以覆盖这个挂载设置。比如:
docker run -d -v mydata:/data xxxx
在这行命令中,就使用了 mydata 这个命名卷挂载到了 /data 这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置
挂载只读卷
docker run -d -P --name web -v /src/webapp:/opt/webapp:rotraining/webapp python app.py
挂载文件
docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
查看数据卷信息
docker inspect web
EXPOSE 声明端口
格式为 EXPOSE <端口1> [<端口2>…] 。
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口。
WORKDIR 指定工作目录
格式为 WORKDIR <工作目录路径>
USER 指定当前用户
格式: USER <用户名>
参考文档
https://docs.docker.com/engine/reference/builder/
案例
Docker运行spring-boot jar包
a.spring-boot项目发布jar包web01.jar
b.创建Dockerfile文件
mkdir spring-boot-testcd spring-boot-testvi DockerfileFROM java:7COPY web01.jar /app.jarEXPOSE 8080ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
c.上传jar包到服务器spring-boot-test目录下
d.构建镜像
docker build -t spring-boot-demo1 .
e.运行容器
docker run --rm -p 8080:8080 spring-boot-demo1
Docker运行Tomcat
a.项目发布war包 web02.war
b.创建Dockerfile文件
mkdir tomcat-testcd tomcat-testvi DockerfileFROM tomcat:7COPY web02.war /usr/local/tomcat/webapps/EXPOSE 8080
c.上传war包到服务器tomcat-test目录下
d.构建镜像
docker build -t web02 .
e.运行容器
docker run --rm -p 8080:8080 web02
compose
安装
curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-composedocker-compose --version
使用
目录结构
├── docker-compose.yml└── web ├── Dockerfile └── web02.jar
docker-compose.yml文件
weba: build: ./web ports: - "8001:8080" expose: - 8001
运行
docker-compose up
compose主要用于多容器整合
例子compose-haproxy-web
目录结构
├── docker-compose.yml├── haproxy│ └── haproxy.cfg└── web ├── Dockerfile ├── web02.war
Dockerfile
FROM tomcat:7COPY web02.war /usr/local/tomcat/webapps/
haproxy.cfg
globallog 127.0.0.1 local0log 127.0.0.1 local1 noticedefaultslog globalmode httpoption httplogoption dontlognulltimeout connect 5000mstimeout client 50000mstimeout server 50000mslisten statsbind 0.0.0.0:70stats enablestats uri /frontend balancerbind 0.0.0.0:8080mode httpdefault_backend web_backendsbackend web_backendsmode httpoption forwardforbalance roundrobinserver weba weba:8080 checkserver webb webb:8080 checkoption httpchk GET /http-check expect status 200
docker-compose.yml
weba: build: ./web expose: - 8080webb: build: ./web expose: - 8080haproxy: image: haproxy:latest volumes: - ./haproxy:/haproxy-override - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro links: - weba - webb ports: - "8000:8080" - "70:70" expose: - "8000" - "70"
启动compose
docker-compose up
导入导出
导出镜像
docker save -o web1.tar.gz nginx:v1
导入镜像
docker load < web1.gz.tar
导出容器
docker export -o web02.tar
导入容器为镜像
docker import web02.tar nginx:v3
提交镜像到私有库
docker tag xxx 172.16.1.17:5000/test/v1docker push 172.16.1.17:5000/test/v1
- docker--docker入门理论
- Docker入门
- Docker入门
- Docker 入门
- docker 入门
- docker入门
- docker入门
- docker 入门
- Docker 入门
- docker 入门
- Docker入门
- Docker-入门
- docker入门
- docker 入门
- docker 入门
- docker入门
- Docker入门
- Docker入门
- ab 压力测试命令
- javaWeb编程_Servlet02
- 初学STL
- 学习之路——网页收藏
- 链表的初始化,增删改查等
- Docker入门
- jQuery中的on与bind绑定事件区别实例详解
- 管辖城市权限控制
- Selenium+PhantomJS自动化测试应用
- 简单的差分之——封印一击
- jmeter之以openfire为例介绍xmpp协议测试
- 深探spring系列-----ioc初始化(1)BeanDefinition的Resource定位
- 项目开发-错误集合
- 博雅笔试记录:输入最小的数