围炉网

一行代码,一篇日志,一个梦想,一个世界

docker 技术知识点集锦

  • export 和 ENV 设置环境变量

    • export的环境变量不会跨镜像层持久化

    • ENV的环境变量会持久化

      • 可以使用docker inspect查看

      • 使用docker run –env <key>=<value>进行修改

    • 测试验证

    FROM centos:6

    ENV FOO=foofoo

    RUN export BAR=barbar

    RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"

    • 构建镜像

    Step 4/4 : RUN export BAZ=bazbaz && echo "$FOO $BAR $BAZ"

    —> Running in eb66196b238d

    foofoo  bazbaz

  • 容器之间的链接(提供了访问其中的某个容器的网络服务而不需要将所需的端口暴露给Docker Host主机的功能)

    • 使用—link参数,以nginx镜像为例子:

docker run --rm --name test1 -d nginx  #开启一个实例test1
docker run --rm --name test2 --link test1 -d nginx #开启一个实例test2并与test1建立链接

    这样,test2与test1便建立了链接,就可以在test2中使用访问test1中的服务了。

    • 使用Docker Compose,还是以上面的nginx镜像为例子

      • 编辑docker-compose.yml文件为:

version: "3"
services:
  test2:
    image: nginx
    depends_on:
      - test1
    links:
      - test1
  test1:
    image: nginx
    • 如果容器没有定义在同一个docker-compose.yml文件中,则需要让链接的容器同属一个外部网络

      • 我们还是使用nginx镜像来模拟这样的一个情景

      • 首先,定义容器test1的docker-compose.yml文件内容为:

version: "3"
services:
  test2:
    image: nginx
    container_name: test1
    networks:
      - default
      - app_net
networks:
  app_net:
    external: true
      • 容器test2内容与test1基本一样,只是多了一个external_links

version: "3"
services:
  test2:
    image: nginx
    networks:
      - default
      - app_net
    external_links:
      - test1
    container_name: test2
networks:
  app_net:
    external: true
      • 这里两个容器的定义里都使用了同一个外部网络app_net,因此,我们需要在启动这两个容器之前通过以下命令再创建外部网络:

docker network create app_net
      • 之后,通过docker-compose up -d命令启动这两个容器,然后执行docker exec -it test2 ping test1,你将会看到已经联通

      • 证明这两个容器是成功链接了,反过来在test1中ping test2也是能够正常ping通的。

      • 如果我们通过docker run –rm –name test3 -d nginx这种方式来先启动了一个容器(test3)并且没有指定它所属的外部网络,而需要将其与test1或者test2链接的话,这个时候手动链接外部网络即可:

      • docker network connect app_net test3

      • 这样,三个容器都可以相互访问了。

  • 如果容器本身没有什么服务需要一直运行的,怎么让docker容器一直运行

    • docker run

docker run <image> tail -f /dev/null
      • 其中tail -f /dev/null 这个程序会一直 block 住,没有外界 signal 的情况下,不会退出,于是 container 就一直 running

    • 或者在dockerfile中设置ENTRYPOINT

ENTRYPOINT ["tail", "-f", "/dev/null"]

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

沪ICP备15009335号-2