docker入门

基本概念

容器(container):用沙盒把进程包装起来运行,和其他的进程独立运行

  • 是一个可运行的镜像实例
  • 可部署在云端、虚拟机、本地
  • 支持各种os
  • 独立于其他的容器,共享同一个os
  • 云原生的核心技术

镜像(image):为容器运行提供独立的文件系统,包含容器运行所需的所有内容:依赖、配置、脚本、二进制文件等等

云原生-从需求产生的技术

As defined by the Cloud Native Computing Foundation (CNCF), Cloud native technologies empower organizations to build and run scalable applications in public, private, and hybrid clouds. Features such as containers, service meshes, microservices, immutable infrastructure, and declarative application programming interfaces (APIs) best illustrate this approach.

These features enable loosely coupled systems that are resilient, manageable, and observable. They allow engineers to make high-impact changes frequently and with minimal effort.

  • 可扩展的资源分配,提高运行效率
  • 不同服务之间的低耦合,提高部署和更新效率

基本原理

docker整体结构

文件系统

multi-container

通信机制

Netshoot 是一个 Docker 容器,包含一套强大的网络故障排除工具。它的作用是帮助用户解决复杂的 Docker 和 Kubernetes 网络问题,提供了必要的工具来进行故障排除。

在使用 netshoot 之前,有一个重要的概念需要理解,那就是网络命名空间(Network Namespaces)。网络命名空间提供网络相关系统资源的隔离。Docker 和 Kubernetes 使用网络命名空间为每个容器或者 Pod 创建一个独立的网络环境。在容器或者 Pod 的网络命名空间中,所有的接口、路由和 IP 地址都是完全隔离的。

Netshoot 允许用户在不同的网络命名空间之间切换,从而在其他容器或者 Pod 中进行网络故障排除。这在跨多个容器或者 Pod 进行网络故障排查时非常有用。此外,netshoot 还可以利用主机的网络命名空间来对主机本身进行故障排除,而无需直接在主机上或者应用程序中安装任何新的软件包。

常用

Build and run an image as a container

  • get the app

  • write a dockerfile

    • docker参考dockerfile自动build镜像
    • 实际上,dockerfile里是build时候需要调用的指令(脚本)
  • docker build -t self-customized-image-name . build并命名镜像

  • docker run -dp 127.0.0.1:3000:3000 self-customized-image-name

    • -d detach 后台运行docker
    • -p 绑定端口,上面这个端口例子publishes the container's port 3000 to 127.0.0.1:3000 (localhost:3000) on the host
  • docker ps 列出所有container(container ID...)

  • docker stop <the-container-id> stop某个container

  • docker rm <the-container-id> remove某个container,便可以在app更新以后重新build和run

Share images using Docker Hub

https://docs.docker.com/get-started/04_sharing_app/

Persist DB

volumes mount

https://docs.docker.com/get-started/05_persisting_data/

提供挂载信息,map the specific filesystem paths of the container back to the host machine,挂载的位置docker定

bind mount

https://docs.docker.com/get-started/06_bind_mounts/

直接共享文件夹,可以实时看到host的修改,share a directory from the host's filesystem into the container

Deploy Docker applications using multiple containers with a database

https://docs.docker.com/get-started/07_multi_container/

  • docker network create todo-app

    • 创建网络,便于不同container的通信
    1
    2
    3
    4
    5
    6
    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:8.0
    • 启动mysql container并attach到之前的网络(mysql docker配置
    • -v 这一行自动volume命名为todo-mysql-data,挂在container的/var/lib/mysql
  • docker run -it --network todo-app nicolaka/netshoots

    • container之间的通信需要用到nicolaka/netshoot工具来辅助,首先启动nicolaka/netshoot
  • dig mysql

    • 使用nicolaka/netshoot提供的DNS工具查看就知道要连接到什么host-name,可以让新的container连接到mysql
1
2
3
4
5
6
7
8
9
docker run -dp 127.0.0.1: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:18-alpine \
sh -c "yarn install && yarn run dev
  • 启动需要连接mysql的container,并提供相应的mysql参数

Run applications using Docker Compose

使用 YAML 文件简化多container应用的启动

https://docs.docker.com/get-started/08_using_compose/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos

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

volumes:
todo-mysql-data:

Reference

[1] https://medium.com/@saschagrunert/demystifying-containers-part-i-kernel-space-2c53d6979504


docker入门
https://al-377.github.io/2023/10/08/docker-intro/
作者
Aidan Lew
发布于
2023年10月8日
许可协议