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某个containerdocker 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
6docker 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 |
|
- 启动需要连接mysql的container,并提供相应的mysql参数
Run applications using Docker Compose
使用 YAML 文件简化多container应用的启动
https://docs.docker.com/get-started/08_using_compose/
1 |
|
Reference
[1] https://medium.com/@saschagrunert/demystifying-containers-part-i-kernel-space-2c53d6979504