科学网

 找回密码
  注册

tag 标签: Docker

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

如何编写最佳的Dockerfile
stefanzan 2019-4-17 10:59
译者按: Dockerfile的语法非常简单,然而如何加快镜像构建速度,如何减少Docker镜像的大小却不是那么直观,需要积累实践经验。这篇博客可以帮助你快速掌握编写Dockerfile的技巧。 原文: How to write excellent Dockerfiles 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习 。 我已经使用Docker有一段时间了,其中编写Dockerfile是非常重要的一部分工作。在这篇博客中,我打算分享一些建议,帮助大家编写更好的Dockerfile。 目标: 更快的构建速度 更小的Docker镜像大小 更少的Docker镜像层 充分利用镜像缓存 增加Dockerfile可读性 让Docker容器使用起来更简单 总结 编写.dockerignore文件 容器只运行单个应用 将多个RUN指令合并为一个 基础镜像的标签不要用latest 每个RUN指令后删除多余文件 选择合适的基础镜像(alpine版本最好) 设置WORKDIR和CMD 使用ENTRYPOINT (可选) 在entrypoint脚本中使用exec COPY与ADD优先使用前者 合理调整COPY与RUN的顺序 设置默认的环境变量,映射端口和数据卷 使用LABEL设置镜像元数据 添加HEALTHCHECK 示例 示例Dockerfile犯了几乎所有的错(当然我是故意的)。接下来,我会一步步优化它。假设我们需要使用Docker运行一个Node.js应用,下面就是它的Dockerfile(CMD指令太复杂了,所以我简化了,它是错误的,仅供参考)。 FROM ubuntu ADD . /app RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y nodejs ssh mysql RUN cd /app npm install # this should start three processes, mysql and ssh # in the background and node app in foreground # isn't it beautifully terrible? 3 CMD mysql sshd npm start 构建镜像: docker build -t wtf . 1. 编写.dockerignore文件 构建镜像时,Docker需要先准备 context ,将所有需要的文件收集到进程中。默认的 context 包含Dockerfile目录中的所有文件,但是实际上, 我们并不需要.git目录,node_modules目录等内容 。 .dockerignore 的作用和语法类似于 .gitignore ,可以忽略一些不需要的文件,这样可以有效加快镜像构建时间,同时减少Docker镜像的大小。示例如下: .git/ node_modules/ 2. 容器只运行单个应用 从技术角度讲,你可以在Docker容器中运行多个进程。你可以将数据库,前端,后端,ssh,supervisor都运行在同一个Docker容器中。但是,这会让你非常痛苦: 非常长的构建时间(修改前端之后,整个后端也需要重新构建) 非常大的镜像大小 多个应用的日志难以处理(不能直接使用stdout,否则多个应用的日志会混合到一起) 横向扩展时非常浪费资源(不同的应用需要运行的容器数并不相同) 僵尸进程问题 - 你需要选择合适的init进程 因此,我建议大家为每个应用构建单独的Docker镜像,然后使用 Docker Compose 运行多个Docker容器。 现在,我从Dockerfile中删除一些不需要的安装包,另外,SSH可以用 docker exec 替代。示例如下: FROM ubuntu ADD . /app RUN apt-get update RUN apt-get upgrade -y # we should remove ssh and mysql, and use # separate container for database RUN apt-get install -y nodejs # ssh mysql RUN cd /app npm install CMD npm start 3. 将多个RUN指令合并为一个 Docker镜像是分层的,下面这些知识点非常重要: Dockerfile中的每个指令都会创建一个新的镜像层。 镜像层将被缓存和复用 当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效 某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效 镜像层是不可变的,如果我们再某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件(只是这个文件在Docker容器中不可见了)。 Docker镜像类似于洋葱。它们都有很多层。为了修改内层,则需要将外面的层都删掉。记住这一点的话,其他内容就很好理解了。 现在,我们 将所有的 RUN 指令合并为一个 。同时把 apt-get upgrade 删除,因为它会使得镜像构建非常不确定(我们只需要依赖基础镜像的更新就好了) FROM ubuntu ADD . /app RUN apt-get update \\ apt-get install -y nodejs \\ cd /app \\ npm install CMD npm start 记住一点,我们只能将变化频率一样的指令合并在一起。将node.js安装与npm模块安装放在一起的话,则每次修改源代码,都需要重新安装node.js,这显然不合适。因此,正确的写法是这样的: FROM ubuntu RUN apt-get update apt-get install -y nodejs ADD . /app RUN cd /app npm install CMD npm start 4. 基础镜像的标签不要用latest 当镜像没有指定标签时,将默认使用 latest 标签。因此, FROM ubuntu 指令等同于 FROM ubuntu:latest 。当时,当镜像更新时,latest标签会指向不同的镜像,这时构建镜像有可能失败。如果你的确需要使用最新版的基础镜像,可以使用latest标签,否则的话,最好指定确定的镜像标签。 示例Dockerfile应该使用 16.04 作为标签。 FROM ubuntu: 16.04 # it's that easy! RUN apt-get update apt-get install -y nodejs ADD . /app RUN cd /app npm install CMD npm start 5. 每个RUN指令后删除多余文件 假设我们更新了apt-get源,下载,解压并安装了一些软件包,它们都保存在 /var/lib/apt/lists/ 目录中。但是,运行应用时Docker镜像中并不需要这些文件。我们最好将它们删除,因为它会使Docker镜像变大。 示例Dockerfile中,我们可以删除 /var/lib/apt/lists/ 目录中的文件(它们是由apt-get update生成的)。 FROM ubuntu: 16.04 RUN apt-get update \\ apt-get install -y nodejs \\ # added lines rm -rf /var/lib/apt/lists/* ADD . /app RUN cd /app npm install CMD npm start 6. 选择合适的基础镜像(alpine版本最好) 在示例中,我们选择了 ubuntu 作为基础镜像。但是我们只需要运行node程序,有必要使用一个通用的基础镜像吗? node 镜像应该是更好的选择。 FROM node ADD . /app # we don't need to install node # anymore and use apt-get RUN cd /app npm install CMD npm start 更好的选择是alpine版本的 node 镜像。alpine是一个极小化的Linux发行版,只有4MB,这让它非常适合作为基础镜像。 FROM node: 7 -alpine ADD . /app RUN cd /app npm install CMD npm start apk 是Alpine的包管理工具。它与 apt-get 有些不同,但是非常容易上手。另外,它还有一些非常有用的特性,比如 no-cache 和 --virtual 选项,它们都可以帮助我们减少镜像的大小。 7. 设置WORKDIR和 CMD WORKDIR 指令可以设置默认目录,也就是运行 RUN / CMD / ENTRYPOINT 指令的地方。 CMD 指令可以设置容器创建是执行的默认命令。另外,你应该讲命令写在一个数组中,数组中每个元素为命令的每个单词(参考 官方文档 )。 FROM node: 7 -alpine WORKDIR /app ADD . /app RUN npm install CMD 8. 使用ENTRYPOINT (可选) ENTRYPOINT 指令并不是必须的,因为它会增加复杂度。 ENTRYPOINT 是一个脚本,它会默认执行,并且将指定的命令错误其参数。它通常用于构建可执行的Docker镜像。entrypoint.sh如下: #!/usr/bin/env sh # $0 is a script name, # $1, $2, $3 etc are passed arguments # $1 is our command CMD= $1 case $CMD in dev ) npm install export NODE_ENV=development exec npm run dev ;; start ) # we can modify files here, using ENV variables passed in # docker create command. It can't be done during build process. echo db: $DATABASE_ADDRESS /app/config.yml export NODE_ENV=production exec npm start ;; * ) # Run custom command. Thanks to this line we can still use # docker run our_image /bin/bash and it will work exec $CMD ${@:2} ;; esac 示例Dockerfile: FROM node: 7 -alpine WORKDIR /app ADD . /app RUN npm install ENTRYPOINT CMD 可以使用如下命令运行该镜像: # 运行开发版本 docker run our-app dev # 运行生产版本 docker run our-app start # 运行bash docker run -it our-app /bin/bash 9. 在entrypoint脚本中使用exec 在前文的entrypoint脚本中,我使用了 exec 命令运行node应用。不使用 exec 的话,我们则不能顺利地关闭容器,因为SIGTERM信号会被bash脚本进程吞没。 exec 命令启动的进程可以取代脚本进程,因此所有的信号都会正常工作。 10. COPY与ADD优先使用前者 COPY 指令非常简单,仅用于将文件拷贝到镜像中。 ADD 相对来讲复杂一些,可以用于下载远程文件以及解压压缩包(参考 官方文档 )。 FROM node: 7 -alpine WORKDIR /app COPY . /app RUN npm install ENTRYPOINT CMD 11. 合理调整COPY与RUN的顺序 我们应该 把变化最少的部分放在Dockerfile的前面 ,这样可以充分利用镜像缓存。 示例中,源代码会经常变化,则每次构建镜像时都需要重新安装NPM模块,这显然不是我们希望看到的。因此我们可以先拷贝 package.json ,然后安装NPM模块,最后才拷贝其余的源代码。这样的话,即使源代码变化,也不需要重新安装NPM模块。 FROM node: 7 -alpine WORKDIR /app COPY package.json /app RUN npm install COPY . /app ENTRYPOINT CMD 12. 设置默认的环境变量,映射端口和数据卷 运行Docker容器时很可能需要一些环境变量。在Dockerfile设置默认的环境变量是一种很好的方式。另外,我们应该在Dockerfile中设置映射端口和数据卷。示例如下: FROM node: 7 -alpine ENV PROJECT_DIR=/app WORKDIR $PROJECT_DIR COPY package.json $PROJECT_DIR RUN npm install COPY . $PROJECT_DIR ENV MEDIA_DIR=/media \\ NODE_ENV=production \\ APP_PORT= 3000 VOLUME $MEDIA_DIR EXPOSE $APP_PORT ENTRYPOINT CMD ENV 指令指定的环境变量在容器中可以使用。如果你只是需要指定构建镜像时的变量,你可以使用 ARG 指令。 13. 使用LABEL设置镜像元数据 使用 LABEL 指令,可以为镜像设置元数据,例如 镜像创建者 或者 镜像说明 。旧版的Dockerfile语法使用 MAINTAINER 指令指定镜像创建者,但是它已经被弃用了。有时,一些外部程序需要用到镜像的元数据,例如 nvidia-docker 需要用到 com.nvidia.volumes.needed 。示例如下: FROM node: 7 -alpine LABEL maintainer jakub.skalecki@example.com ... 14. 添加HEALTHCHECK 运行容器时,可以指定 --restart always 选项。这样的话,容器崩溃时,Docker守护进程(docker daemon)会重启容器。对于需要长时间运行的容器,这个选项非常有用。但是,如果容器的确在运行,但是不可(陷入死循环,配置错误)用怎么办?使用 HEALTHCHECK 指令可以让Docker周期性的检查容器的健康状况。我们只需要指定一个命令,如果一切正常的话返回0,否则返回1。对HEALTHCHECK感兴趣的话,可以参考 这篇博客 。示例如下: FROM node: 7 -alpine LABEL maintainer jakub.skalecki@example.com ENV PROJECT_DIR=/app WORKDIR $PROJECT_DIR COPY package.json $PROJECT_DIR RUN npm install COPY . $PROJECT_DIR ENV MEDIA_DIR=/media \\ NODE_ENV=production \\ APP_PORT= 3000 VOLUME $MEDIA_DIR EXPOSE $APP_PORT HEALTHCHECK CMD curl --fail http://localhost: $APP_PORT || exit 1 ENTRYPOINT CMD 当请求失败时, curl --fail 命令返回非0状态。 关于Fundebug Fundebug 专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家 免费试用 ! 版权声明 转载时请注明作者 Fundebug 以及本文地址: https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/
个人分类: Docker|2507 次阅读|0 个评论
Pulsar_Docker在Ubuntu 16.04 LTS的安装(失败)
zhangyanyun 2018-8-8 17:44
1.安装Docker:(U为我的用户名) $ sudo apt-get update $ sudo apt-get -f install Do you want to continue? y $ sudo apt -get install docker The following NEW packages will be installed: docker 0 upgraded, 1 newly installed, 0 to remove and 230 not upgraded. Need to get 12.2 kB of archives. After this operation, 65.5 kB of additional disk space will be used. Get:1 http://mirrors.ustc.edu.cn/ubuntu xenial/universe amd64 docker amd64 1.5-1 Fetched 12.2 kB in 0s (41.1 kB/s) Selecting previously unselected package docker. (Reading database ... 897130 files and directories currently installed.) Preparing to unpack .../docker_1.5-1_amd64.deb ... Unpacking docker (1.5-1) ... Processing triggers for man-db (2.7.5-1) ... Setting up docker (1.5-1) ... $ docker version The program 'docker' is currently not installed. You can install it by typing: sudo apt install docker.io $ sudo apt install docker.io The following additional packages will be installed: bridge-utils cgroupfs-mount ubuntu-fan Suggested packages: aufs-tools btrfs-tools debootstrap docker-doc rinse zfs-fuse | zfsutils The following NEW packages will be installed: bridge-utils cgroupfs-mount docker.io ubuntu-fan 0 upgraded, 4 newly installed, 0 to remove and 230 not upgraded. Need to get 17.1 MB of archives. After this operation, 90.5 MB of additional disk space will be used. Do you want to continue? y $ docker version Client: Version: 17.03.2-ce API version: 1.27 Go version: go1.6.2 Git commit: f5ec1e2 Built: Thu Jul 5 23:07:48 2018 OS/Arch: linux/amd64 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.27/version: dial unix /var/run/docker.sock: connect: permission denied $ su Password: root@U: /home/U# docker version Client: Version: 17.03.2-ce API version: 1.27 Go version: go1.6.2 Git commit: f5ec1e2 Built: Thu Jul 5 23:07:48 2018 OS/Arch: linux/amd64 Server: Version: 17.03.2-ce API version: 1.27 (minimum version 1.12) Go version: go1.6.2 Git commit: f5ec1e2 Built: Thu Jul 5 23:07:48 2018 OS/Arch: linux/amd64 Experimental: false 安装完毕! 2.安装pulsar_docker: root@U: /home/U# git clone https://github.com/mserylak/pulsar_docker.git root@U: /home/U# docker build -t pulsar_docker ./pulsar_docker/ Building dependency tree... Reading state information... Err:1 http://security.ubuntu.com/ubuntu xenial-security InRelease Temporary failure resolving 'security.ubuntu.com' Err:2 http://us.archive.ubuntu.com/ubuntu trusty InRelease Temporary failure resolving 'us.archive.ubuntu.com' Err:3 http://archive.ubuntu.com/ubuntu xenial InRelease Temporary failure resolving 'archive.ubuntu.com' Err:4 http://archive.ubuntu.com/ubuntu xenial-updates InRelease Temporary failure resolving 'archive.ubuntu.com' Err:5 http://archive.ubuntu.com/ubuntu xenial-backports InRelease Temporary failure resolving 'archive.ubuntu.com' 失败!! --- 6.BUG: 尝试过以下方法: A:换 source.list: 从 USTC 切换为 Tinghua B:改变DNS: 将DNS改为 8.8.8.8 等 以上两种方法都不管用!!!
个人分类: 菜鸟一号|4372 次阅读|0 个评论
如何清理Docker占用的磁盘空间?
stefanzan 2018-1-25 20:50
摘要: 用了 Docker,好处挺多的,但是有一个不大不小的问题,它会一不小心占用太多磁盘,这就意味着我们 必须 及时清理。 作为一个有信仰的技术公司,我们 Fundebug 的后台采用了酷炫的全 Docker 化架构,所有服务,包括数据库都运行在 Docker 里面。这样做当然不是为了炫技,看得清楚的好处还是不少的: 所有服务器的配置都非常简单,只安装了 Docker,这样新增服务器的时候要简单很多。 可以非常方便地在服务器之间移动各种服务,下载 Docker 镜像就可以运行,不需要手动配置运行环境。 开发/测试环境与生产环境严格一致,不用担心由于环境问题导致部署失败。 至少,上线这一年多来,Docker 一直非常稳定,没有出什么问题。但是,它有一个不大不小的问题,会比较消耗磁盘空间。 如果 Docker 一不小心把磁盘空间全占满了,你的服务也就算玩完了,因此所有 Docker 用户都需要对此保持 警惕 。当然,大家也不要紧张,这个问题还是挺好解决的。 1. docker system 命令 在 谁用光了磁盘?Docker System 命令详解 中,我们详细介绍了 docker system 命令,它可以用于管理磁盘空间。 docker system df 命令,类似于 Linux 上的 df 命令,用于查看 Docker 的磁盘使用情况: docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 147 36 7.204GB 3.887GB (53%) Containers 37 10 104.8MB 102.6MB (97%) Local Volumes 3 3 1.421GB 0B (0%) Build Cache 0B 0B 可知,Docker 镜像占用了 7.2GB 磁盘,Docker 容器占用了 104.8MB 磁盘,Docker 数据卷占用了 1.4GB 磁盘。 docker system prune 命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及 dangling 镜像(即无 tag 的镜像)。 docker system prune -a 命令清理得更加彻底,可以将没有容器使用 Docker 镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的 Docker 镜像都删掉了…所以使用之前一定要想清楚吶。 执行 docker system prune -a 命令之后,Docker 占用的磁盘空间减少了很多: docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 10 10 2.271GB 630.7MB (27%) Containers 10 10 2.211MB 0B (0%) Local Volumes 3 3 1.421GB 0B (0%) Build Cache 0B 0B 2. 手动清理 Docker 镜像/容器/数据卷 对于旧版的 Docker(版本 1.13 之前),是没有 docker system 命令的,因此需要进行手动清理。这里给出几个常用的命 删除所有关闭的容器 docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm 删除所有 dangling 镜像(即无 tag 的镜像): docker rmi $(docker images | grep ^none | awk {print $3 } ) 删除所有 dangling 数据卷(即无用的 volume): docker volume rm $(docker volume ls -qf dangling= true ) Fundebug 提供实时、专业的错误监控服务,为您的线上代码保驾护航,欢迎大家免费使用! 3. 限制容器的日志大小 有一次,当我使用 1 与 2 提到的方法清理磁盘之后,发现并没有什么作用,于是,我进行了一系列分析。 在 Ubuntu 上,Docker 的所有相关文件,包括镜像、容器等都保存在 /var/lib/docker/ 目录中: du -hs /var/lib/docker/ 97G /var/lib/docker/ Docker 竟然使用了将近 100GB 磁盘,这也是够了。使用 du 命令继续查看,可以定位到真正占用这么多磁盘的目录: 92G /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53 由 docker ps 可知,nginx 容器的 ID 恰好为 a376aa694b22 ,与上面的目录 /var/lib/docker/containers/a376aa694b22 的前缀一致: docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a376aa694b22 192.168.59.224:5000/nginx:1.12.1 nginx -g 'daemon off 9 weeks ago Up 10 minutes nginx 因此,nginx 容器竟然占用了 92GB 的磁盘。进一步分析可知,真正占用磁盘空间的是 nginx 的日志文件。那么这就不难理解了。我们 Fundebug 每天的数据请求为百万级别,那么日志数据自然非常大。 使用 truncate 命令,可以将 nginx 容器的日志文件“清零”: truncate -s 0 /var/lib/docker/containers/a376aa694b22ee497f6fc9f7d15d943de91c853284f8f105ff5ad6c7ddae7a53/*-json.log 当然,这个命令只是临时有作用,日志文件迟早又会涨回来。要从根本上解决问题,需要 限制 nginx 容器的日志文件大小 。这个可以通过配置日志的 max-size 来实现,下面是 nginx 容器的 docker-compose 配置文件: nginx: image: nginx:1.12.1 restart: always logging: driver: json-file options: max-size: 5g 重启 nginx 容器之后,其日志文件的大小就被限制在 5GB ,再也不用担心了~ 4. 重启 Docker 还 有一次 ,当我清理了镜像、容器以及数据卷之后,发现磁盘空间并没有减少。根据 Docker disk usage 提到过的建议,我重启了 Docker,发现 磁盘使用率从 83%降到了 19% 。根据高手 指点 ,这应该是与内核 3.13 相关的 BUG,导致 Docker 无法清理一些无用目录: it’s quite likely that for some reason when those container shutdown, docker couldn’t remove the directory because the shm device was busy. This tends to happen often on 3.13 kernel. You may want to update it to the 4.4 version supported on trusty 14.04.5 LTS. The reason it disappeared after a restart, is that daemon probably tried and succeeded to clean up left over data from stopped containers. 我查看了一下内核版本,发现真的是 3.13: uname -r 3.13.0-86-generic 如果你的内核版本也是 3.13,而且清理磁盘没能成功,不妨重启一下 Docker。当然,这个晚上操作比较靠谱。 参考 谁用光了磁盘?Docker System 命令详解 INTRODUCING DOCKER 1.13 Docker 文档:docker system Docker 文档:json-file Docker disk usage 关于Fundebug Fundebug 专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了10亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家 免费试用 ! 版权声明 转载时请注明作者 Fundebug 以及本文地址: https://blog.fundebug.com/2018/01/10/how-to-clean-docker-disk/
个人分类: Docker|2850 次阅读|0 个评论
花式安装蓝鲸鱼札记
GISdsq 2017-11-10 00:05
大家好,蓝鲸鱼又来了。 自从上篇搞完蓝鲸鱼在Win 7下安装之后,笔者就看到了另一篇文章。 Win10 Docker 安装使用 感觉仿佛很棒的样子。于是我们就开始愉快地新系(zuo)统(si)旅程,笔者顺手就升级了Win 10系统。这里顺带介绍一个神器。 YUMI是一个多系统USB启动盘制作的软件。最早是在知乎回答上看到。 如何制作支持安装多系统(Win/Linux)的U盘启动盘? YUMI官网 也可以点击这个百度网盘地址 操作手册。 一键安装即可。 好。回到正题。Win 10升完之后,我遇上了各种有的没的bug。。。包括蓝鲸鱼! 当然还是先简介下怎么安装。 算了。。。自己看官网文档去。 官网 简单地说。我遇上的问题就是如下。 其实总结起来,就是网络网卡一些问题。百度、必应、谷歌都未果。但是在github上找到了对应的issues。 Hyper-V was unable to find a virtual switch with name “DockerNAT”. 然后历经磨难,突然发现,是我的毒霸把一堆服务给禁止了。然后没有按顺序一个个开启,一堆毛病。于是就愉快地开启docker之旅。
个人分类: 技术干货|1786 次阅读|0 个评论
Win7下蓝鲸鱼安装以及Xshell连接操作
GISdsq 2017-11-6 11:32
我爱吃金拱门,开封菜也不错,但我觉得最好吃的是小红帽,那我们就来安装个蓝鲸鱼吧。 1 Docker简介 隆重推出我们的主人公——蓝鲸鱼,Docker先生。 接下来让我抄一段百度百科的简介。 Docker (基于Go语言开发!基于Go语言开发!基于Go语言开发!)是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 看不够的点这里,看不懂的点这里 。 嗯,所以这东西吧,你可以把它当成小型虚拟机,貌似目前的需求也差不多,配置消耗相对虚拟机小得多,相对来说能快速部署环境是个优点。 具体的也可以查看 Docker官网 2 Win 7下安装过程 目前来看,Docker跟Linux和MacOS系统应该还是更相容的,但是毕竟我们是研究GIS的人员,Windows才是王道(谁让ArcGIS只有windows版本呢?呃,不过其实QGIS和GRASS GIS就有各种平台版本,功能也相当强大)。那么如何在Win 7下安装Docker呢?其实这样子我们通过Docker去运行Linux环境(用Docker的话讲,这叫容器)的话,相对更方便些,消耗资源也比虚拟机小,这也是我开始安装的目的。本文就来介绍下。 目前Docker在Win 10最新系统安装已经十分方便,而且不需要依赖Virtual Box。 具体就看官网吧 直接下载Docker for Windows的app安装就可以。 而Win 7的话,上面那个不支持,所以还得依赖Virtual Box(其实说来还是得靠虚拟机)。接下来就来讲讲怎么安装吧。 Win 7上使用Docker Toolbox.exe进行安装。 github下载地址 ,但是这个地址国内下载很慢(而且似乎不是很新,也可以从 Docker官网 下载)。可以用下面的另一个地址。 下载地址 下载下来之后,就只需双击exe开始安装。 如果第二步已经安装过Git和Virtual也可以不勾选,中间还会让安装Oracle的一些东西,全部安装即可。但是后面就不能直接双击.sh文件运行docker了,得在git bash下面运行。 安装完毕之后,应该会出现这两个文件。 通常双击什么的快速启动终端就可以了,第一次需要配置花的时间久一点。或者也可以到Docker安装文件夹下,双击.sh文件。不过后面发现这会报错,找不到boot2docker.iso文件,而这个文件就在Docker安装文件夹下。 先将这个iso文件拷贝到,C: Administrator.docker\\machine\\cache下,再运行就.sh文件或者运行Docker Quickstart Terminal就成功了。 3 用Xshell连接自己的Docker 用单纯的命令行有很多限制,一般可以用终端模拟器来连接,这里用的Xshell,也可以用其他终端模拟器。 这里用户名为docker,密码为tcuser(默认)。 连接成功。接下来运行个hello world。 docker run hello-world 4 docker hub注册 这个就是可以将自己的镜像push到仓库里的账户,登陆的话,只需要敲入如下命令。 docker login 填入账户和密码即可。 账户名最好用小写字母和数字即可。 一些参考博客及文档。 创建Docker Hub账号库 你的Docker Hub账户 使用Docker Hub | Docker 中文指南 DOCKER windows 7 详细安装教程 Windows7 上运行docker实战 完整记录在 windows7 下使用 docker 的过程 Docker在windows下的使用【一】
个人分类: 技术干货|1590 次阅读|0 个评论
什么是Docker Volume?
stefanzan 2017-6-7 18:03
摘要 : Docker Volume ,通常翻译为 数据卷 ,用于保存持久化数据。当我们将数据库例如MySQL运行在Docker容器中时,一般将数据通过 Docker Volume 保存在主机上,这样即使删除MySQL容器,数据依然保存在主机上,有效保证了数据的安全性。这篇博客将通过简单的实践帮助大家理解 什么是Docker Volume 。 本文所有命令都是在 play-with-docker 的在线Docker实例上执行,Docker版本为 17.05.0-ce 。 1. 指定Docker Volume 使用 docker run 命令,可以运行一个 Docker容器 docker run -itd --volume /tmp/data1:/tmp/data2 --name test ubuntu bash 基于ubuntu镜像创建了一个Docker容器。 容器的名称为test,由 –name 选项指定。 Docker Volume 由 –volume 选项指定,主机的 /tmp/data1 目录与容器中的 /tmp/data2 目录一一对应。 2. 查看Docker Volume 使用 docker inspect 命令,可以查看 Docker容器 的详细信息: docker inspect --format= '{{json .Mounts}}' test | python -m json.tool 使用 –format 选项,可以选择性查看需要的容器信息。 .Mount 为容器的 Docker Volume 信息。 python -m json.tool 可以将输出的json字符串格式化显示。 Source 表示主机上的目录,即 /tmp/data1 。 Destination 为容器中的目录,即 /tmp/data2 。 3. 本机文件可以同步到容器 在本机/tmp/data1目录中新建hello.txt文件 touch /tmp/data1/hello.txt ls /tmp/data1/ hello.txt hello.txt文件在容器/tmp/data2/目录中可见 使用 docker exec 命令,可以在容器中执行命令。 docker exec test ls /tmp/data2/ hello.txt 可知,在本机目录 /tmp/data1/ 的修改,可以同步到容器目录 /tmp/data2/ 中。 4. 容器文件可以同步到主机 在容器/tmp/data2目录中新建world.txt文件 docker exec test touch /tmp/data2/world.txt docker exec test ls /tmp/data2/ hello.txt world.txt world.txt文件在主机/tmp/data1/目录中可见 ls /tmp/data1/ hello.txt world.txt 可知,在容器目录 /tmp/data2/ 的修改,可以同步到主机目录 /tmp/data1/ 中。 5. 结论 Docker Volume 本质上是容器与主机之间共享的目录或者文件,这样 Docker Volume 中的数据可以在主机和容器中实时同步。使用Virtualbox创建虚拟机时,也可以配置共享目录,这与 Docker Volume 非常相似。 欢迎加入 我们Fundebug 的 Docker技术交流群: 305097057 。 版权声明: 转载时请注明作者 Fundebug 以及本文地址: https://blog.fundebug.com/2017/06/07/what-is-docker-volume/
2168 次阅读|0 个评论
虚拟机与Docker有何不同?
stefanzan 2017-5-31 09:34
译者按: 各种 虚拟机 技术开启了 云计算 时代;而 Docker ,作为下一代虚拟化技术,正在改变我们 开发、测试、部署 应用的方式。那 虚拟机 与 Docker 究竟有何不同呢? 原文: Comparing Virtual Machines vs Docker Containers 译者: Fundebug 为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习 。 首先,大家需要明确一点, Docker容器 不是 虚拟机 。 2014年,当我第一次接触Docker的时候,我把它比做一种轻量级的虚拟机。这样做无可厚非,因为Docker最初的成功秘诀,正是它比虚拟机更节省内存,启动更快。Docker不停地给大家宣传,”虚拟机需要数分钟启动,而Docker容器只需要50毫秒”。 然而, Docker容器 并非 虚拟机 ,我们不妨来比较一下它们。 理解虚拟机 使用 虚拟机 运行多个相互隔离的应用时,如下图: 从下到上理解上图: 基础设施(Infrastructure) 。它可以是你的 个人电脑 ,数据中心的 服务器 ,或者是 云主机 。 主操作系统(Host Operating System) 。你的个人电脑之上,运行的可能是 MacOS , Windows 或者某个 Linux 发行版。 虚拟机管理系统(Hypervisor) 。利用Hypervisor,可以在 主操作系统 之上运行多个不同的 从操作系统 。类型1的Hypervisor有支持MacOS的 HyperKit ,支持Windows的 Hyper-V 以及支持Linux的 KVM 。类型2的Hypervisor有VirtualBox和VMWare。 从操作系统(Guest Operating System) 。假设你需要运行3个相互隔离的应用,则需要使用Hypervisor启动3个 从操作系统 ,也就是3个 虚拟机 。这些虚拟机都非常大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗很多CPU和内存。 各种依赖 。每一个 从操作系统 都需要安装许多依赖。如果你的的应用需要连接PostgreSQL的话,则需要安装 libpq-dev ;如果你使用Ruby的话,应该需要安装gems;如果使用其他编程语言,比如Python或者Node.js,都会需要安装对应的依赖库。 应用 。安装依赖之后,就可以在各个 从操作系统 分别运行应用了,这样各个应用就是相互隔离的。 理解Docker容器 使用 Docker容器 运行多个相互隔离的应用时,如下图: 不难发现,相比于 虚拟机 , Docker 要简洁很多。因为我们不需要运行一个臃肿的 从操作系统 了。 从下到上理解上图: 基础设施(Infrastructure) 。 主操作系统(Host Operating System) 。所有主流的Linux发行版都可以运行Docker。对于MacOS和Windows,也有一些办法”运行”Docker。 Docker守护进程(Docker Daemon) 。Docker守护进程取代了Hypervisor,它是运行在操作系统之上的后台进程,负责管理Docker容器。 各种依赖 。对于Docker,应用的所有依赖都打包在 Docker镜像 中, Docker容器 是基于 Docker镜像 创建的。 应用 。应用的源代码与它的依赖都打包在 Docker镜像 中,不同的应用需要不同的 Docker镜像 。不同的应用运行在不同的 Docker容器 中,它们是相互隔离的。 对比虚拟机与Docker Docker守护进程 可以直接与 主操作系统 进行通信,为各个 Docker容器 分配资源;它还可以将容器与 主操作系统 隔离,并将各个容器互相隔离。 虚拟机 启动需要数分钟,而 Docker容器 可以在数毫秒内启动。由于没有臃肿的 从操作系统 ,Docker可以节省大量的磁盘空间以及其他系统资源。 说了这么多Docker的优势,大家也没有必要完全否定 虚拟机 技术,因为两者有不同的使用场景。 虚拟机 更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而 Docker 通常用于隔离不同的应用,例如 前端 , 后端 以及 数据库 。 如果你对Docker感兴趣的话,不妨学习一下 Dive Into Docker course 。 欢迎加入 我们Fundebug 的 Docker技术交流群: 305097057 。 版权声明: 转载时请注明作者 Fundebug 以及本文地址: https://blog.fundebug.com/2017/05/31/docker-and-vm/
2375 次阅读|0 个评论
[转载]docker挂载本地目录
hsm 2015-1-23 15:32
docker可以支持把一个宿主机上的目录挂载到镜像里。 ? 1 docker run -it -v/home/dock/Downloads:/usr/Downloadsubuntu64 /bin/bash 通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径。 现在镜像内就可以共享宿主机里的文件了。 默认挂载的路径权限为读写。如果指定为只读可以用:ro ? 1 docker run -it -v/home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash docker还提供了一种高级的用法。叫数据卷。 数据卷:“其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的”。感觉像是由一个容器定义的一个数据挂载信息。其他的容器启动可以直接挂载数据卷容器中定义的挂载信息。 看示例: ? 1 docker run -v/home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash 创建一个普通的容器。用--name给他指定了一个名(不指定的话会生成一个随机的名子)。 再创建一个新的容器,来使用这个数据卷。 ? 1 docker run -it --volumes-from dataVol ubuntu64 /bin/bash --volumes-from用来指定要从哪个数据卷来挂载数据。 原文:http://my.oschina.net/piorcn/blog/324202
个人分类: 计算机学习|4290 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-17 14:24

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部