$ ls ~yifei/notes/

docker 基础概念

Posted on:

Last modified:

Docker 是一个进程的容器,不是虚拟机。它为一个进程隔离了文件系统、网络和环境变量。 最好在其中运行一个且仅运行一个线程,而不是运行多个任务。

使用场景

  1. 为有不同需求的应用创建不同的隔离环境。比如部署两个脚本,一个需要用 Python 2.7,另一个 需要用 Python 3.6。
  2. 管理进程,类似 systemd 或者 supervisord 的角色。

docker run

每次执行 docker run, 都会根据镜像来创建一个全新的 container, 可以使用 docker start 或者 docker attach 来连接上已经创建的 container。image 和 container 的关系大概类似于 程序和进程之间的关系。

  • docker run OPTIONS IMAGE COMMAND 运行一个镜像,并产生一个容器
    • 使用 -d 选项作为 daemon 运行
    • --restart=always 总是自动重启这个容器
    • -p set ports [host:container]
    • -it 以交互模式运行
    • --name=NAME 设定名字
    • --rm clean the container after running
    • --net sets the network connected to
    • -w sets working dir
    • -e 设定环境变量
    • -u sets user
    • -v sets volume host_file:container_file:options
  • docker exec OPTIONS CONTAINER COMMAND 在容器内运行命令
    • docker exec -it [container] /bin/bash 可以进到容器内部的 shell
  • docker start CONTAINER_ID 重启停止的容器
  • docker ps -a 显示所有的 container
  • docker pull 拉取镜像
  • docker images 列出当前机器上的所有镜像
  • docker build -t TAG 根据 dockerfile 构建镜像,镜像名字: user/image:tag

网络

docker 有两个网络模式:

  • 桥接模式
  • Host 模式

使用 docker run --net="bridge",这种模式会使用虚拟网卡 docker0 做了一层 NAT 转发, 所以效率比较低,优点是不用改变应用分配固定端口的代码,docker 会在宿主机上随机分配一个端口, 避免冲突。

使用 docker run --net="host",宿主机和 docker 内部使用的都是同一个网络,如 eth0

docker network ls    ls the network interfaces
docker network inspect    inspect the network for details
docker network create/rm    create network interface
docker network connect/disconnect [net] [container]    connect a container to a network

Docker 会在容器内的 /etc/hosts 自动设置好 container 名字的映射,所以在容器之间可以用 名字直接访问。

Docker 容器一般来说是无状态的,除了保存到数据库之外,还可以使用卷来把容器中的状态保存出来。 Docker 中最好运行的是无状态的服务,这样方便于横向扩展。

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

日志

在 Docker 中,一般情况下应该把日志直接打到 stdout,这样方便日志收集程序收集。可以使用 docker logs [contianer] 查看打到 stdout 的日志。

参考

  1. https://blog.talpor.com/2015/01/docker-beginners-tutorial/
WeChat Qr Code

© 2016-2022 Yifei Kong. Powered by ynotes

All contents are under the CC-BY-NC-SA license, if not otherwise specified.

Opinions expressed here are solely my own and do not express the views or opinions of my employer.

友情链接: MySQL 教程站