Docker学习之路系列(2)

127 阅读8分钟

镜像替换参考链接

  • 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: