【Docker】快速入门之Docker基本概念、Dockerfile构建、repository镜像共享、volume挂载、容器通信network、docker-compose、layer cac...

docker是方便项目环境部署的虚拟化技术,每个docker容器有自己的文件系统和网络接口。本文将参考官网文档,主要介绍docker的基本概念通过Dockerfile构建镜像镜像共享volume mountdocker networkdocker-composelayer caching,方便快速入门docker。

1.docker基本概念

  • image镜像,拥有独立的环境,包括文件系统和网络接口。
  • container容器,是image的实例,每个运行的容器进程可提供指定服务。
  • tag标签,image的标签,标识不同的镜像版本。
  • repository仓库,类似git的仓库,repository是docker hub下的仓库,image在仓库中,可从仓库pull镜像,push镜像到仓库。
  • volume卷,用于持久化DB、容器路径挂载宿主机,保证容器环境可动态加载。
  • layer层,根据Dockerfile构建镜像时将根据每层指令进行操作,关于依赖下载的layer可以通过缓存cache,避免每次修改文件重复执行install dependency操作。
  • network网络,container相互隔离,每个container都有独立的网络接口,不同container可根据同一个network进行网络通信。

2.基于Dockerfile构建镜像
创建镜像容器的第一种方式是:docker run image,如果本地image不存在,则会自动从docker hub上拉取镜像。第二种方式就是通过Dockerfile文件构建镜像。
Dockerfile示例

# syntax=docker/dockerfile:1
FROM node:12-alpine
WORKDIR /app
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]
ENTRYPOINT ["ls","-l"]

Dockerfile是关于指令的文件,可查阅官方文档了解每个指令的作用。
上述指令分别为:
FROM:当前要构建的镜像的,来源image,相当于父镜像。
WORKDIE: 工作目录。
RUN:镜像执行的语句。
COPY:拷贝宿主机的文件至镜像。
CMD:给正在运行的容器提供初始值命令, run image(运行镜像)时容器的初始命令值,若在run中手动增加命令值,则会替换CMD的初始值。
ENTRYPOINT: 同CMD,为运行容器的初始命令值,区别在run中手动增加会追加到ENTRYPOINT后面。

  • 构建镜像:
    docker build -t imageName .
    末尾的 .表示Dockerfile所在的地址,即当前目录。
  • 查看镜像:
    docker images
  • 运行镜像容器:
    docker run --name containerName -p 3000:3000 imageName
    其中, -p表示可选参数中的端口映射,前面是host端口,后面是容器端口。
    --name是给容器设置别名,下次可使用该容器实例:
    docker start containerName
    其他可选参数可通过:docker run --help查看。
  • 查看容器列表:
    docker ps
  • 关闭容器:
    docker stop containerId/containerName

3.镜像共享repository
类似Github,不同主机可以通过pull/push镜像至Docker Hub的repository来共享image。

  • 拉取镜像
    docker pull repository/image:tag
  • 本地镜像打标签
    docker tag sourceImage:tag targetImage:tag
  • 推送镜像
    docker push repository/image:tag

4.named volume与volume mount
volume是实现容器和宿主机数据同步的一种方式,有两种类型:named value和volume mount

  • named volume
    命名卷,可用于持久化DB数据,由于容器彼此隔离,容器中的数据无法共享,通过指定named volume,可将container中的数据持久化至宿主机中
    创建volume:
    docker volume create volumeName
    开启容器时指定volume
    docker run -p 3000:3000 -v volumeName:containerPath image:tag
    容器内数据存储地址为containerPath,该指令可使数据同步到volumeName中。
    查看volume详情
    docker volume inspect volumeName
[
    {
        "CreatedAt": "2022-02-26T07:50:45Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todolist/_data",
        "Name": "todolist",
        "Options": {},
        "Scope": "local"
    }
]

其中,Mountpoint挂载点即宿主机存储volume数据的位置。

  • volume mount
    如果只是简单地持久化DB数据,可以使用named volume;但如果要同步代码,保证宿主机的改动可以同步到容器中,比如实现热部署。这时就需要指定容器应用在宿主机的Mountoint挂载点(named volume是docker自动指定的挂载点)。
    指定挂载点运行容器
    docker run -p 3000:3000 -w /app -v "$(pwd):/app" imageName
    在-v中,$(pwd)表示当前目录,该指令表示当前container的/app路径挂载到当前目录,这样当前目录改动代码后容器内代码也随着改动

5.docker network
由于docker容器彼此独立,容器间无法直接通信。但不同容器需要通信完成服务,比如Nginx-Php应用容器需要与Mysql容器通信,因此需要通过docker network进行容器通信,同一网络下的容器可进行通信,不同网络下的容器无法通信。

  • 创建network
    docker network create networkName

  • 多容器通信
    开启mysql容器,指定network
    docker run -d
    --network todo-app --network-alias mysql
    -v todo-mysql-data:/var/lib/mysql
    -e MYSQL_ROOT_PASSWORD=secret
    -e MYSQL_DATABASE=todos
    mysql:5.7

    开启application容器,指定network
    docker run -dp 3000:3000
    -w /app -v "$(pwd):/app"
    --network todo-app
    -e MYSQL_HOST=mysql
    -e MYSQL_USER=root
    -e MYSQL_PASSWORD=secret
    -e MYSQL_DB=todos
    node:12-alpine
    sh -c "yarn install && yarn run dev"

    上述开启了两个container,并指向了同一个network;mysql容器通过-e设置环境变量,将参数传递到mysql容器中,登录mysql并创建database;app容器也设置了环境变量传递到app容器中用于连接登录mysql容器。

  • 查看network信息

    1.nicolaka/netshoot

    官方推荐了一个镜像nicolaka/netshoot,可用排查和调试网络问题。运行该镜像并设置该镜像的network为需要调试的网络。可选项-it表示运行并进入容器,使用DNS工具dig命令即可查询host的ip地址,如dig mysql(上述mysql容器中,--network-alias mysql设置了容器的网络别称)。

6.docker-compose运行容器服务
是不是觉得一个个开启容器的方式优点麻烦,docker-compose工具就是用来解决该问题,可以理解它是管理容器运行的工具。该工具可以根据yml配置文件,一行简单的命令即可开启多个相关容器,实现应用服务部署(比如LNMP服务搭建)。
安装docker-compose很简单就不介绍了。

  • 创建docker-compose.yml
    示例:
version: "3.7"
services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

进入docker-compose.yml所在目录。
运行应用服务:
docker-compose up
配置文件解析:创建volume用于持久化Mysql数据,并开启app容器和Mysql容器。

关于network:


2.compose-network

需要注意的是,compose文件中并没有指定network,但docker-compose会自动创建network,并给每个容器分配

可以打开localhost:3000运行下该项目(测试的是官网todolist示例应用),如下图所示。


3.todoList-app

7.layer caching镜像层缓存依赖
关于第二点Dockerfile构建镜像的补充优化,其中有一层指令是下载依赖,意味着每一次build镜像时都会去下载依赖,即使只是修改了一行无关依赖的业务代码,显然这很低效不合理。

  • 优化方式即layer caching,对指定层依赖文件进行缓存;
  • 实现方式:利用copy指令复制依赖文件实现layer caching。
  • 示例:COPY package.json yarn.lock ./
    同时需要注意增加.dockerignore文件,根据具体情况指定忽略的copy文件

以上是docker的基础知识以及基本使用方法,想要深入了解更多特性可以参考官网文档。

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

推荐阅读更多精彩内容