容器实战指北:一篇让你快速上手Docker的全指导

| 作者简介

|安装docker环境

安装docker环境就不用再提了,直接参考官方文档就可以了,需要注意在中国境内玩docker,最好配好镜像加速器。

|Docker常用操作

获取镜像

docker pull centos
docker pull centos:6.7
docker pull ${inner_docker_hub_ip}/${hub_user}/${image_name}:${image_tag}

运行镜像

docker run -it --rm ubuntu bash
docker run -d ubuntu
docker run -d -p 80:80 nginx
docker run -d -v /tmp/data:/var/lib/mysql -p 3306:3306 mysql

操作镜像

docker image ls
docker image ls ${repository_name}
docker rmi ${image_id}
docker rmi -f ${image_id}
docker image prune
docker tag ${image_id} ${image_name}:${image_tag}

编译镜像

docker build --rm -t ${image_name}:${image_tag} ./Dockerfile

操作容器

docker ps
docker stop ${container_id}
docker start ${container_id}
docker logs ${container_id}
docker exec -it ${container_id} bash
selected_container_ids=$(docker ps | grep ${filter_word} | awk '{print $1}')
docker rm -f ${container_id}

推送镜像

docker tag ${image_name}:${image_tag} ${inner_docker_hub_ip}/${hub_user}/${image_name}:${image_tag}
docker login ${inner_docker_hub_ip}
docker push ${inner_docker_hub_ip}/${hub_user}/${image_name}:${image_tag}

|编写Dockerfile

最近的工作还涉及编写一些镜像的Dockerfile文件,Dockerfile的语法比较简单,常用的大概是以下的指令

ARG指令

ARG  CODE_VERSION=latest
FROM base:${CODE_VERSION}

FROM指令

FROM centos:6.7

LABEL指令

LABEL maintainer="SvenDowideit@home.org.au"

COPY指令

COPY package.json /usr/src/app/

COPY hom* /mydir/
COPY hom?.txt /mydir/

ADD指令

ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

RUN指令

RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'

EXPOSE指令

EXPOSE 3306
EXPOSE 80/tcp
EXPOSE 80/udp

VOLUME指令

VOLUME ["/data"]

WORKDIR指令

WORKDIR /path/to/workdir

USER指令

USER mysql

CMD指令

CMD ["/usr/bin/wc","--help"]

ENTRYPOINT指令

CMD ["/usr/bin/wc","--help"]

ENTRYPOINT指令与CMD指令共同作用时,实际效果比较复杂,可参考下面的表格:

还有一些指令 ONBUILDHEALTHCHECKENV不太常用,直接参考官方文档就可以。

|编写docker-compose.yml

docker-compose.yml的编写也比较简单,参考下面的例子:

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

简单扩展就可以了。下面说一下平时常用的一些指令关键字。

build

指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。我比较少用到它,习惯于先生成好镜像,再直接使用镜像

depends_on

解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web,如下面的例子:

version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres

env_file

从文件中获取环境变量,可以为单独的文件路径或列表。

如果通过 docker-compose-f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。

如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。

env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env

环境变量文件中每一行必须符合格式,支持 # 开头的注释行。

# common.env: Set development environment
PROG_ENV=development

expose

暴露端口,但不映射到宿主机,只被连接的服务访问。

仅可以指定内部端口为参数

expose:
 - "3000"
 - "8000"

extra_hosts

类似 Docker 中的 --add-host 参数,指定额外的 host 名称映射信息。

extra_hosts:
 - "googledns:8.8.8.8"
 - "dockerhub:52.1.157.61"

会在启动后的服务容器中 /etc/hosts 文件中添加如下两条条目。

8.8.8.8 googledns
52.1.157.61 dockerhub

image

指定为镜像名称或镜像 ID。如果镜像在本地不存在, Compose 将会尝试拉取这个镜像。

image: ubuntu
image: orchardup/postgresql
image: a4bc65fd

networks

配置容器连接的网络。

version: "3"
services:

  some-service:
    networks:
     - some-network
     - other-network

networks:
  some-network:
  other-network:

ports

暴露端口信息。

使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。

ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式。

volumes

数据卷所挂载路径设置。可以设置宿主机路径 ( HOST:CONTAINER) 或加上访问模式 ( HOST:CONTAINER:ro)。

该指令中路径支持相对路径。

volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

完整的指令关键字列表见这里。

|运行整个容器项目

使用以下命令运行起整个容器项目:

docker-compose up -f ./docker_compose.yml -d
# 停止整个容器项目
# docker-compose down -f ./docker_compose.yml 

|其它发现

整个容器项目做完后,在网上又找到一个官方给出的写可复用docker-compose方案,简单看了下文档,貌似很简单:

# 生成docker-compose.yml文件
docker-app render
# 用生成的docker-compose.yml文件运行整个容器项目
docker-app render | docker-compose -f - up
# 生成docker-compose.yml时指定一些选项
docker-app render --set version=0.2.3 --set port=4567 --set text="hello production"
# 生成helm的Chart,这个很方便啊,有木有
docker-app helm

|参考

  1. https://yeasy.gitbooks.io/docker_practice
  2. https://docs.docker.com/engine/reference/builder
  3. https://github.com/docker/app

腾讯云TStack

长按左边二维码关注我们~~

原文发布于微信公众号 - 腾讯云TStack(gh_035269c8aa5f)

原文发表时间:2018-09-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

docker学习(5) 在mac中创建mysql docker容器

github上有一个专门的docker-libary项目,里面有各种各样常用的docker镜像,可以做为学习的示例,今天研究下其中mysql镜像的用法,国内镜像...

2138
来自专栏漫漫全栈路

Docker 循序渐进

上一篇大致介绍了什么是Docker和其安装(以Ubuntu为例)。这篇来说说,Docker的基本操作。 非Root用户授权 上一篇的演示中使用的都是默认登...

4008

如何使用Docker Compose

如果您的Docker应用程序包含多个容器(例如,在不同容器中运行的Web服务器和数据库),从单独的Dockerfiles构建,运行和连接容器将非常麻烦且耗时。但...

2172
来自专栏PHP技术大全

docker 镜像与容器的导入导出操作实践

公司有一台测试服务器,网速比较慢,特别是下载一些国外站点镜像的时候,而我本机则比较快,还有梯子,所以在思考一个问题;是否能在我本地把镜像下载下来,然后复制到测试...

2311
来自专栏晓晨的专栏

ASP.NET Core 2.1 使用Docker运行

2012
来自专栏云计算教程系列

使用Patroni和HAProxy创建高度可用的PostgreSQL集群

PostgreSQL(Postgres)是一个开源的,完全符合ACID标准的关系数据库,可在所有主要操作系统上运行。虽然Postgres是一个功能丰富且功能强大...

6154
来自专栏五毛程序员

从0开始搭建自动部署环境

3455
来自专栏测试驿栈

Docker基础操作

   Docker是一个虚拟环境容器,可以将你的环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地部署了git,jenkins...

1463
来自专栏IT笔记

Docker学习之SSH连接docker容器

前言 不论是开发者是运维人员,都经常有需要进入容器的诉求,目前看,主要的方法不外乎以下几种: 使用ssh登陆进容器,需要在容器中安装启动sshd,存在开销和攻击...

41711
来自专栏晓晨的专栏

ASP.NET Core 2.1 使用Docker运行

这里我们需要用到官方的镜像:microsoft/dotnet:2.1-aspnetcore-runtime

2522

扫码关注云+社区

领取腾讯云代金券