一、Docker基本概念
1.镜像(Image)
Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。
docker的镜像是由 镜像名+版本 组成的。如果没有指定镜像名没有指定版本,默认是latest版本最新版本。
2.容器(Container)
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。
3.仓库(Repository)
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。
4.卷(volume)
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除
5.网络(network)
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
6.docker-compose
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。目前 Docker 官方用 GO 语言 重写 了 Docker Compose,并将其作为了 docker cli 的子命令,称为 Compose V2
Compose 中有两个重要的概念:
服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
二、Docker 常用命令
2.1镜像命令
下载镜像
docker pull nginx //下载镜像
docker pull nginx:v1.4.14
运行镜像
docker run -it nginx //运行镜像
docker run -it --rm ubuntu:18.04 bash // 运行镜像并进入shell 退出后删除镜像
docker run --name webserver -d -p 80:80 nginx // 运行镜像,--name 给镜像取一个名字 -d 后台运行模式 -p 镜像端口映射
镜像帮助信息
docker image --help // 获取镜像操作的命令帮助
搜索镜像
docker search nginx // 搜索nginx镜像
查看镜像历史信息
docker image history nginx // 查看镜像历史
查看镜像详细信息
docker image inspect nginx //查看镜像详细信息
列出镜像
docker images //列出镜像
docker image ls //列出镜像
docker image ls -a //docker image ls 命令列表中只显示顶层镜像。-a 参数可以显示包括中间层在内的所有镜像
docker image ls nginx //根据仓库名列出镜像
docker image ls nginx:v2 //根据某个特定标签列出镜像
docker image ls -f since=mongo:3.2 //mongo:3.2 之后建立的镜像 before 之前
docker image ls -f label=dev //列出标签是dev的镜像
docker images -q -f reference='eshop/*:dev' // 根据名称和标签匹配并只显示id
docker image ls --format "{{.ID}}: {{.Repository}}" // 模板语法
查看镜像、容器、数据卷大小
docker system df //查看镜像、容器、数据卷所占的空间大小
删除镜像
docker image rm centos:v7 // 按照标签tag删除镜像,也可以根据image id删除
//删除镜像的前提是该镜像没有运行成容器;docker image rm 等同docker rmi命令;如果需要强行删除已经运行为容器的镜像,可以使用-f选项来指定;
docker image rm af34 //根据ID删除镜像,一般取前3个字符或以上就可以了
docker image rm $(docker image ls -q nginx) //过滤删除命令。删除所有仓库名为 nginx 的镜像
docker image rm $(docker image ls -q -f before=nginx:v2)
docker image rm $(docker images -q -f reference='eshop/*:dev') //-f
docker image prune //删除虚悬镜像
给镜像打tag
docker tag centos centos:v6.7 //给镜像打标签 tag
2.2容器命令
新建并启动容器
docker run ... //新建并启动容器命令
docker run centos:v7 /bin/echo 'Hello World' //输出一个 'Hello World'之后终止容器
docker run -t -i centos:v7 /bin/bash // 启动一个bash端,允许用户进行交互,-t 让Docker分配一个伪终端(pesudo-tty)并绑定到容器的标准输入上,-i 让容器的标准输入保持打开
docker run -d centos:v7 /bin/sh -c "while true;do echo 11;sleep 1; done" //-d 在后台运行
//提示:可以用 docker logs 查看输出的结果
查看容器本身的信息
docker container ls // 查看容器信息
docker container ls -a
查看容器日志信息
docker container logs //获取容器的log输出信息
docker container logs [container ID or NAMES]
查看容器层改变
docker diff name
终止和启动容器
docker container stop // 终止一个运行中的容器
docker container ls -a // 可以查看容器终止的状态信息
docker container start //启动一个已经终止的容器
docker container restart // 将一个运行态的容器终止,然后重新启动
进入容器 docker attach 或 docker exec
docker run -dit centos
docker container ls
docker attach a12f // a12f 容器ID的前4个字符
docker exec -it 34af bash // -i 这个参数没有分配伪终端但是保持了标准输出,-t 分配一个伪终端
exec与attach两者区别:attach 不会启动新的进程,用exit退出容器跟着停止。exec启动新的进程,exit退出容器不会停止。
导出容器
docker export r1dfdere112122 > centos.tar //r1dfdere112122 容器ID
导入容器快照
cat centos.tar | docker import - test/centos:v1.0 //本地导入
docker import URL //通过指定的url导入
从容器内拷贝文件到主机上 (注:如果是在容器内,需要exit先切换到宿主机上)
docker cp 容器id:容器内路径 目的主机路径 (例如:docker cp 123123:/data/test.txt /data id为123123的容器,将/data/test.txt文件拷贝到宿主机/data目录下)
删除容器
docker container rm 删除一个处于终止状态的容器
docker container rm centos
//提示:如果要删除一个运行中的容器,需要添加参数 -f 参数。 这时,docker 会发送 SIGKILL 信号给容器。
清理所有终止状态的容器
docker container ls -a // 查看所有已经创建包括终止状态的容器
docker container prune // 清除所有的容器
2.3 仓库命令
你可以使用官方 registry 镜像来运行
docker run -d -p 5000:5000 --restart=always --name registry registry
这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录。
docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry
2.4 数据卷命令
创建数据卷
docker volume create first-volume
查看所有的数据卷
docker volume ls
查看某一数据卷信息
docker volume inspect first-volume
挂载数据卷的容器
docker run -d -P \
--name web \
#-v first-volume:/webapp \ // -v 参数挂载
--mount source=first-volumn, target=/webapp \
training/webapp \
python app.py
//创建一个名为web的容器,并挂载数据卷到容器的 /webapp 目录
查看数据卷信息
docker inspect web
删除数据卷
docker volumn rm first-volumn
数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据库,也不存在垃圾回收机制处理没有任何容器引用的数据卷。
如果要在删除容器时候删除数据就,可以在删除容器时候使用 docker rm -v 这个命令
清除数据卷
docker volume prune // 清除无主的数据卷
--mount 可以挂载一个本地主机目录导容器中去
docker run -d -P \
--name web \
--mount type=bind, source=/src/webapp, target=/opt/webapp \
training/webapp \
python app.py
//上面的命令就是挂在主机的 /src/webapp 目录到容器的 /opt/webapp 目录。
2.5网络命令
端口绑定 参数:
-P(大写) :Docker会随机映射一个 49000-49900 的端口到内部容器开发的网络端口
-p(小写) : 自定义端口映射
映射随机端口:
docker run -d -P training/webapp python app.py
docker container ls -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
//本地主机的 49155 被映射到了容器的5000端口。此时访问本机的49155端口即可访问容器内web应用提供的界面
查看应用信息
docker logs -f nostalgic_morse
自定义端口映射
docker run -d -p 5000:5000 training/webapp python app.py
// 默认把本机所有地址的映射到5000端口上
自定义指定地址的端口:
docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
自定义地址的任意端口
docker run -d -p 127.0.0.1::5000 training/webapp python app.py
指定udp端口
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置 docker port
docker port nostalgic_morse 5000
绑定多个端口 -p
docker run -d \
-p 5000:5000 \
-p 3000:80 \
training/webapp \
python app.py
容器互连
一般使用docker,会使用 --link 来使容器互连。
现在则可以使用 -d 参数来指定docker的网络类型。docker网络类型有 bridge,overlay。
创建新的docker网络
docker network create -d bridge first-net
连接容器
docker run -it --rm --name busybox1 --network first-net busybox sh
// 打开新的终端,在运行一个容器并加入 first-net 网络
docker run -it --rm --name busybox2 --network first-net busybox sh
// 在打开一个终端查看容器信息
docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47060aca56b busybox "sh" 11 minutes ago Up 11 minutes busybox2
8720575823ec busybox "sh" 16 minutes ago Up 16 minutes busybox1
// 用ping命令证明容器busybox1和容器busybox2建立了互连关系
// 进入 busybox1 容器,然后输入以下命令
ping buxybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
三、docker-compose 常用命令
compose V2 新增的命令
将文件从服务容器复制到本地文件系统
docker compose cp my-service:~/path/to/myfile ~/local/path/to/copied/file
从本地文件复制到所有正在运行的容器中
docker compose cp --all ~/local/path/to/source/file my-service:~/path/to/copied/file
docker compose ls --all --format json // 输出json格式
获得一个命令的帮助
docker-compose 命令 --help
构建并启动所有容器,如果镜像存在就重新构建
docker-compose up -d --build
启动所有服务
docker-compose up -d
构建启动nignx容器
docker-compose up -d nginx
-f 指定使用的Compose配置文件启动,默认为docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d
运行一个服务,并在服务上执行一个命令
docker-compose run 容器id或容器名 ip addr
登录到nginx容器中
docker-compose exec nginx bash
此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose down
列出项目中运行的所有容器
docker-compose ps
列出项目中运行及未运行的所有容器
docker-compose ps -a
列出所有运行的服务容器
docker-compose ls
列出所有服务容器(包括未运行的容器)
docker-compose ls -a
重新启动nginx容器
docker-compose restart nginx
构建镜像
docker-compose build nginx
不带缓存的构建
docker-compose build --no-cache nginx
查看各个服务容器内运行的进程
docker-compose top
查看nginx的实时日志
docker-compose logs -f nginx
列出 Compose 文件包含的镜像
docker-compose images
验证文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
docker-compose config
以json的形式输出nginx的docker日志
docker-compose events --json nginx
暂停nignx容器
docker-compose pause nginx
恢复ningx容器
docker-compose unpause nginx
删除容器(删除前必须关闭容器,执行stop)
docker-compose rm nginx
强制删除容器(不必先关闭容器)
docker-compose rm -f nginx
停止nignx容器
docker-compose stop nginx
启动nignx容器
docker-compose start nginx
重启项目中的nignx容器
docker-compose restart nginx
下载依赖的镜像
docker-compose pull
推送服务依的镜像
docker-compose push
设置指定服务运行的容器个数。通过service=num的参数来设置数量
docker-compose scale web=3 db=2
查看版本信息
docker-compose version
四、其他常用命令
//docker-desktop: 存储在 %LOCALAPPDATA%\Docker\wsl\distro
//docker-desktop-data: 存储在 %LOCALAPPDATA%\Docker\wsl\data(占用空间的元凶)
用WSL命令迁移docker-desktop-data到其他位置
wsl --shutdown
关闭所有发行版: wsl --shutdown
导出 docker-desktop-data 发行版: wsl --export docker-desktop-data D:\wsl\docker\docker-desktop-data\data.tar
注销 docker-desktop-data 发行版: wsl --unregister docker-desktop-data
导入 docker-desktop-data 到期望迁移的目录: wsl --import docker-desktop-data D:\wsl\docker\docker-desktop-data\ D:\wsl\dockerdocker-desktop-data\data.tar
将Windows上已经存在的文件移植到wsl下Ubuntu的docker container中去
// sudo passwd root 给root用户设置密码。su -
cp -r /mnt/d/项目文件 /home/存放目录
docker ps --no-trunc //显示container的ID全称
docker cp /home/存放目录 container id:/home
标签:容器,compose,--,nginx,常用命令,镜像,docker
From: https://www.cnblogs.com/qing1126/p/17347218.html