docker通关攻略 - 基础
一、架构
介绍 | |
---|---|
Docker Damon | 即dockerd,用来监听 Docker API 的请求和管理 Docker 对象,比如镜像、容器、网络和 Volume。 |
Docker Client | 即我们常说的docker命令,是我们和 Docker 进行交互的最主要的方式方法,比如我们可以通过 docker run 命令来运行一个容器,然后我们的这个 client 会把命令发送给上面的 Dockerd,让他来做真正事情。 |
Docker Registry | 用来存储 Docker 镜像的仓库 |
Images | 镜像,镜像是一个只读模板,带有创建 Docker 容器的说明,一般来说的,镜像会基于另外的一些基础镜像并加上一些额外的自定义功能。比如,你可以构建一个基于 Centos 的镜像,然后在这个基础镜像上面安装一个 Nginx 服务器,这样就可以构成一个属于我们自己的镜像了。 |
Containers | 容器,容器是一个镜像的可运行的实例,可以使用 Docker REST API 或者 CLI 来操作容器,容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。 |
二、基本操作
1) 镜像
1. 获取镜像
$ docker pull [OPTIONS] [Docker Registry Address[:Port]]NAME[:TAG|@DIGEST]
2. 列出镜像
$ docker image ls
3. 删除镜像
$ docker rmi [OPTIONS] IMAGE [IMAGE...]
4. 推送镜像到仓库
# 修改镜像名
$ docker tag <镜像名>:<标签> <远程仓库用户>/<镜像名>:<标签>
# 推送到远程仓库
$ docker push <远程仓库用户>/<镜像名>:<标签>
5. 迁移镜像
# 保存镜像 文件名建议使用 镜像名-标签.tar.gz
$ docker save <镜像名:标签> | gzip > <文件名.tar.gz>
# 加载镜像
$ docker load -i <文件名.tar.gz>
利用pv管道合并命令
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
2) 容器
1. 运行容器
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
2. 列出容器
$ docker ps [OPTIONS]
3. 启动/停止容器
# 启动
$ docker start [OPTIONS] CONTAINER [CONTAINER...]
# 停止
$ docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 重启
$ docker restart [OPTIONS] CONTAINER [CONTAINER...]
4. 删除容器
$ docker rm [OPTIONS] CONTAINER [CONTAINER...]
查看镜像、容器、数据卷所占用的空间。
$ docker system df
5. 容器内外拷贝数据
docker cp
命令用于在 Docker 容器和宿主机之间复制文件或目录。
$ docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
$ docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
- SRC_PATH: 源路径(可以是容器内的路径或宿主机的路径)。
- CONTAINER: 容器的名称或 ID。
- DEST_PATH: 目标路径(可以是容器内的路径或宿主机的路径)。
# 从容器复制文件到宿主机
$ docker cp my_container:/path/in/container /path/on/host
# 从宿主机复制文件到容器
$ docker cp /path/on/host my_container:/path/in/container
# 从容器复制目录到宿主机
$ docker cp my_container:/path/in/container /path/on/host
# **从宿主机复制目录到容器**
$ docker cp /path/on/host my_container:/path/in/container
3) dockerfile
4) 数据共享和持久化
在容器中管理数据主要有两种方式:
- 数据卷(Data Volumes)
- 挂载主机目录 (Bind mounts)
1. 数据卷
数据卷
是一个可供一个或多个容器使用的特殊目录。可以在容器之间共享和重用
# 创建数据卷
$ docker volume create my-vol
# 列出数据卷
$ docker volume ls
local my-vol
# 查询数据卷信息
$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
# 挂在数据卷,-v或--mount命令都可以,建议使用--mount
$ docker run -d -P \
--name web \
# -v my-vol:/wepapp \
--mount source=my-vol,target=/webapp \
training/webapp \
python app.py
# 查看容器信息,也见到挂架数据卷的信息
$ docker inspect web
...
"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...
# 删除数据卷
$ docker volume rm my-vol
# 清理空闲且无用的数据卷
$ docker volume prune
2. 挂在主机目录或文件
# 挂在主机目录,-v或--mount命令都可以,建议使用--mount
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp \
--mount type=bind,source=/src/webapp,target=/opt/webapp \
training/webapp \
python app.py
# 只读
$ docker run -d -P \
--name web \
# -v /src/webapp:/opt/webapp:ro \
--mount type=bind,source=/src/webapp,target=/opt/webapp,readonly \
training/webapp \
python app.py
5) 网络模式
# 列出所有docker网络
$ docker network ls
# 创建一个bridge模式的docker网络
$ docker network create -d bridge my-net
1. Bridge模式
在主机上创建一个名为docker0
的虚拟网桥,此主机上启动的Docker
容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0
子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。
# 运行一个容器并连接到新建的 my-net 网络(bridge网络模式)
$ docker run -it --rm --name busybox1 --network my-net busybox sh
2. Host 模式
如果启动容器的时候使用host
模式,那么这个容器将不会获得一个独立的Network Namespace
,而是和宿主机共用一个 Network Namespace。使用宿主机的 IP 和端口。
# 运行一个容器(host网络模式)即共享宿主机IP
$ docker run -tid --net=host --name docker_host1 ubuntu-base:v3
3. Container 模式
指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。即与一个指定的容器共享 IP、端口范围等
# 运行一个容器(container网络模式)即docker_bri1和docker_con1两个容器共享一个ip,ip在docker_bri1创建时分配
$ docker run -tid --net=container:docker_bri1 \
--name docker_con1 ubuntu-base:v3
4. None模式
Docker 容器拥有自己的 Network Namespace,但是,并不为Docker 容器进行任何网络配置。
即没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。
$ docker run -tid --net=none --name \
docker_non1 ubuntu-base:v3