镜像替换参考链接
- Docker 把应用程序及其依赖,打包在image文件里面,只有通过这个这个文件才能升Docker容器
- image文件可以看做是容器的模板
- Docker根据image文件生成实例
- 同一个image文件,可以生成多个同时运行的容器实例
- 镜像不是一个单一的文件,而是多层
- 容器其实就在镜像的最上面加了一层读写层,在运行容器里做的任何改动,都会写到这个读写层里。如果容器删除了,最上面的读写层也就删除了,改动也就消失
- 我们可以通过
docker history <ID/NAME>
查看镜像中各层及大小,每层对应Dockerfile中的一条指令
命令 | 含义 | 案例 |
---|---|---|
ls | 查看全部镜像 | docker image ls |
search | 查找镜像 | docker search [imageName] |
histroy | 查看镜像历史 | docker history [imageName] |
inspect | 显示一个或者多个镜像详细信息 | docker inspect [imageName] |
pull | 拉取镜像 | docker pull [imageName] |
push | 推送一个镜像到镜像仓库 | docker push [imageName] |
rmi | 删除镜像 | docker rmi [imageName] docker image rmi 2 |
prune | 移除未使用的镜像,没有被标记或被任何容器使用 | docker image prune |
tag | 标记本地镜像,将其归入某一仓库 | docker image tag [imageName] [username]/[repository]:[tag] |
export | 导出tar归档创建镜像 | docker export -o mysqlv1.tar a404c6c174a2 |
import | 导入容器快照文件系统tar归档文件创建镜像 | docker import mysqlv1.tar zf/mysql:v2 |
save | 保存一个或多个镜像到一个tar归档文件 | docker save -o mysqlv2.tar zf/mysqlv2:v3 |
load | 加载镜像存储文件来自tar归档或标准输入 | docker load -i mysqlv2.tar |
build | 根据Dockerfile构建镜像 |
export 导出容器到文件 import 把文件导入为镜像
save 把镜像导出为文件 load 把文件导入镜像 不能修改名字和标签
容器里面不放日志,放在宿主机上
容器
docker run
命令会从image文件,生成一个正在运行的容器实例。docker container run
命令具有自动抓取image文件的功能,如果发现本地没有指定的image文件,就会从仓库自动抓取- image 文件生成的容器实例,本身也是一个文件,成为容器文件。
- 容器生成,就会同时存在两个文件: image 文件和容器文件
- 关闭容器并不会删除容器文件,只是让容器停止运行
命令
命令 | 含义 | 案例 |
---|---|---|
run | 从镜像运行一个容器 | docker run unbuntu /bin/echo 'hello world' |
ls | 列出容器 | docker container ls |
inspect | 显示一个或多个容器详细信息 | docker inspect |
attach | 要attach的容器必须正在运行,可以同时连上同一个容器来共享屏幕 | docker attach |
stats | 显示容器资源统计 | docker container stats |
top | 显示一个容器运行的进程 | docker container top |
update | 更新一个或者多个容器 | docker container update |
port | 显示容器的端口映射 | docker container posr |
ps | 查看当前运行的容器 | docker ps -a -l |
kill [containerId] | 终止容器(发送SIGKILL) | docker kill [containerId] |
rm [containerId] | 删除容器 | docker kill [containerId] |
start [containerId] | 启动已经生成、已经停止的容器 | docker start [containerId] |
stop [containerId] | 终止容器运行 | docker container stop [containerId] |
logs [containerId] | 查看docker容器的输出 | docker container logs [containerId] |
exec [containerId] | 进入一个正在运行的docker容器执行命令 | docker container exec -it [containerId] /bin/bash |
cp [containerId] | 从正在运行的Docker容器里面把文件拷贝到本地 | docker container cp [containerId]:app/package.json |
commit [containerId] | 创建一个新镜像来自一个容器 | docker commit -a "jinxin" -m "message" [containerId] mynginx:latest |
参数 | 含义 |
---|---|
-i | 交互式 |
-t | 分配一个为终端 |
-d | 运行容器到后台 |
-a | 附加到运行的容器 |
-e --env list | 设置环境变量 |
-p --publish list | 发布容器端口到主机 |
-P | --publish-all |
--mount mount | 挂载宿主分区到容器 |
-v,--volumn list | 挂载宿主机分区到容器 |
删除容器
docker rm $(docker ps -a -q) // 删除所有容器
制作Dockerfile
编写Dockerfile
命令 | 含义 | 案例 |
---|---|---|
FROM | 继承的镜像 | FROM node |
COPY | 拷贝 | COPY ./app /app |
WORKDIR | 指定工作路径 | WORKDIR /app |
RUN | 编译打包阶段运行命令 | RUN npm install |
EXPOSE | 暴露端口 | EXPOSE 3000 |
CMD | 容器运行阶段运行命令 | CMD npm run start |
.dockerignore
.git
node_modules
创建image
docker build -t express-demo .
- -t用来指定image镜像的名称,后面可以加冒号标签,如果不指定默认就是latest
- . 表示Dockerfile所在的路径
使用新的镜像运行容器
docker container run -p 3333:3000 -it express-demo /bin/bash
- -p 参数是将容器的3000端口映射为本机的3000端口
- -it 将容器的shell容器映射为当前的shell,在本机容器执行的命令都会发送到容器中执行
- express-demo image的名字
- /bin/bash 容器启动后执行的第一个命令,这里启动了bash容器
- --rm在容器终止运行后自动删除容器文件
发布image
docker login
docker image tag [imageName] [username]/[repository]:[tag]
docker image build -t [username]/[repository]:[tag] .
docker tag express-demo nicematthew/express-demo:1.0.0
docker push nicematthew/express-demo:1.0.0
数据盘
删除容器的时候,容器里面创建的文件也会被删除,如果想保存数据,比如日志,数据库数据
volume
volume Docker 管理宿主文件系统的一部分,如果没有指定卷,则会自动创建,建议使用--mount,更通用
创建数据卷
docker volume create nginx-vol
#把nginx-vol数据卷挂载到/usr/share/nginx/html
docker run -d -it --name=nginx1 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d -it --name=nginx2 -v nginx-vol:/user/share/nginx/html nginx
删除数据卷
docker container stop nginx1 停止容器
docker container rm nginx1 删除容器
docker volume rm nginx-vol 删除数据库
管理数据盘
docker volume ls
docker volume ls dangling=true # 列出已经孤立的数据盘
docker rm xxx
Bind mounts
- 覆盖容器内已存在的目录或文件,但并不会改变容器内原有的文件,当unmount后容器内原有的文件就会还原
- 创建容器的时候,我们可以通过-v或者-volume指定数据盘
- bind mounts 可以存储在宿主主机的任意位置
- 如果源文件或者目录不存在,会报错
- 如果挂载在容器中非空目录,则该目录现有内容将被隐藏
默认数据盘
docker run -v /mnt:/mnt -it --name logs centos bash
cd /mnt
echo 1 > 1.txt
exit
docker inspect logs
"Mounts": [
{
"Source":"/mnt/sda1/var/lib/docker/volumes/dea6a8b3aefafa907d883895bbf931a502a51959f83d63b7ece8d7814cf5d489/_data",
"Destination": "/mnt",
}
]
- Source的值是给容器指定的数据盘上主机的位置
- Destination 的值是这个数据盘在容器的位置
指定数据盘
mkdir ~/data
docker run -v ~/data:/mnt -it --name log2 centos bash
cd /mnt
echo 3 > 3.txt
exit
cat ~/data/3.txt
~data:/mnt 把当前目录中的data映射到容器中的mnt
指定数据盘容器
docker create -v /mnt --name logger centos
docker run --volumes-from logger --name logger3 -it centos bash
docker run --volumes-from logger --name logger4 -it centos bash
网络
docker 里面有一个DNS服务,可以通过容器名称访问主机 网络类型
- none 无网络,对外界完全隔离
- host 主机网络
- bridge 桥接网络,默认网络
bridge
docker network ls
docker inspect bridge
docker run -d --name server1 nginx
docker run -d --name server2 nginx
docker exec -it server1 nginx
ping server2
none
docker run -d --name server_none --net none nginx
docker inspect none
docker exec -it server_none bash
host
docker run -d --name server_host --net host nginx
访问桥接网络里面的服务
docker run -d --name server_nginx -p 8000:80 nginx
指向主机的随机端口
docker run -d --name webserver --publish 80 nginx
docker run -d --name webserver --P nginx
创建自定义网络
docker network create --driver brige web
指定网络
docker run -d --name webserver --net web nginx
docker network connect web webserver1
docker network disconnect web webserver2
compose
- compose通过一个配置文件来管理多个Docker 容器,在配置文件中, 所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合适合多个容器进行开发的长江
步骤
- 在docker-compose.yml中定义组成应用程序的程序,以便他们可以在隔离的环境中一起运行
- 运行docker-compose up ,Compose将启动并运行整个应用程序
- services 可以定义服务,每个服务都有自己的名字,使用的镜像、挂载的数据卷所属的网络和依赖的其他服务
- networks是应用的网络,在他下面可以定义使用的网络名称,类型
docker-compose.yml
version: '2'
services:
test1:
image: nginx
port:
- "8080:80"
test2:
image: nginx
port:
- "8081:80"
启动
docker-compose up 启动所有的服务
docker-compose -d 后台启动所有的服务
docker-compose ps 打印所有的容器
docker-compose stop 停止所有服务
docker-compose logs -f 持续跟踪日志
docker-compose exec zfpx1 bash 进入zfpx服务系统
docker-compose rm 删除服务容器
docker network ls 网络不会删除
docker-compose down 删除网路
配置网络
docker-compose up -d
docker-compse exec test1 bash
ping test2
配置数据卷和根目录
version: '2'
services:
test1:
image: nginx
ports:
- "8080:80"
networks:
- "test"
volumes:
- "access:/mnt"
- "./test1:/usr/share/nginx/html"
test2:
image: nginx
ports:
- "8081:80"
networks:
- "test"
volumes:
- "access:/mnt"
- "./test:/usr/share/nginx/html"
test3:
image: nginx
ports:
- "8082:80"
networks:
- "default"
- "test"
networks:
test:
driver: bridge
volumes:
access: