Docker 简介
Docker 是一个开源的应用容器引擎,你可以将其理解为一个轻量级的虚拟机,开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
基本概念
- 镜像: 一个包含了完成的操作系统以及一些完成应用的模板;
- 容器: 通过镜像实例化而来,有自己独立的空间、网络空间、文件空间等,基于镜像可以创建多个容器。每个容器都是完全隔离的。
- 仓库: 不是用来存放容器的,而是用来存放镜像的,可以是公共仓库也可以是私有的,docker官方的镜像hub.docker.com, 国内也有很多镜像仓库,例如网易、阿里云等。
主要用途
(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
常用命令
1. 通过Dockerfile构建镜像
编辑dockerfile文件,文件名称最好是Dockerfile,这样构建的时候不用指定 vim Dockerfile
# FROM开头表示使用什么操作系统 可以是centos
FROM alpine
# 每一个RUN是一层,最多可以是127层
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add gcc g++ libc-dev wget vim openssl-dev make linux-headers
# RUN的层级不宜过多,过多会臃肿执行时间长,且可能会出错,可以使用 && 开头 \ 结尾减少层级
RUN mkdir -p /usr/src/redis
RUN cd /usr/src/redis
# 下载完的安装包应该及时 rm 删除掉,否则安装的包会非常大,应该在当前层删除,下一层删除无效。可以将缓存一起删掉
RUN wget -O redis-4.0.11.tar.gz "http://download.redis.io/releases/redis-4.0.11.tar.gz"
RUN tar -xzf redis-4.0.11.tar.gz -C /usr/src/redis
RUN cd /usr/src/redis/redis-4.0.11 && make && make PREFIX=/usr/local/redis install
2. 镜像基本指令
- 创建镜像
要在Dockerfile同级目录下创建 redis为要构建的镜像名称 v1 为标签,别忘记后面的.表示路径
Docker build -t redis:v1 .
- 查看构建镜像的历史操作步骤
4193375bceea为镜像的ID,也可以使用镜像名称
Docker history 4193375bceea
- 查看创建的镜像
docker images
- 删除镜像
# 删除1个镜像
docker rmi 镜像名称/镜像ID
# 删除所有镜像
docker rmi $(docker images -q)
-导出镜像
# 方式一:redis-master 容器名称 redis.tar 要导出的文件名称 包含了镜像和指定的容器内容,实际上导出的是容器,相当于是一个快照。
#导出的文件小,无层级关系,没有历史操作,不可以回滚。
docker export redis-master > redis.tar
#方式二: redis:v1 镜像名称 redis.tar 要导出的文件名称 导出的是镜像
#导出的文件大,因为导出的文件是带历史的,有层级关系,可以用于回滚到某个历史层
docker save redis:v1 > redis.tar
-导入镜像
# redis.tar 要导入的镜像文件名称 redis:v2 要创建的镜像名称:标签 通过export导出时用
docker import redis.tar redis:v2
#redis.tar 要导入的镜像文件名称,通过save方式导出时用
docker load < redis.tar
3.容器基本指令
-创建容器
#redis-master 容器名称 redis:v2 自己构建的镜像名称,
#如果不加v2,且本地没有构建过redis,则会从官方镜像中拉取最新版本的redis镜像
#bash docker的运行机制,在构建容器的时候要求必须要有前台挂起的进程,官方的镜像不用加bash
docker run -itd --name redis-master redis:v2 bash
-查看容器
#查看所有容器
docker ps -a
#查看指定容器详细信息 redis_test 容器名称
docker inspect redis_test
-运行容器
docker exec -it redis-master bash
-停止容器
#停止当前容器 redis-master 容器名称,也可以替换为容器ID
docker stop redis-master
#停止所有容器
docker stop ($docker ps -a -q)
-删除容器
#删除指定容器 redis-master 容器名称,也可以替换为容器ID
docker rm redis-master
#删除所有容器
docker rm $(docker ps -a -q)
-退出容器
exit
-查看容器日志
#7454464e48c4 容器ID
docker logs 7454464e48c4
容器网络
默认会创建3种网络类型:
桥接网络: bridge 默认容器使用的网络模式
无指定网络: --network=none 容器不分配局域网IP
主机网络: host ,使用–network=host ,宿主机端口地址自动映射到容器中。使用同一个端口
查看默认网络
docker network ls
指定自定义网络
默认不能指定固定的网络地址,需要手动创建自定义网络,指定网段。并命名
docker network create --subnet=192.168.1.0/24 mynetwork
指定地址创建容器
# -V 为容器挂载目录
docker run -itd --name redis-master --net mynetwork -p 6380:6379 --ip 192.168.1.2 -V /usr/local/docker/redis:/usr/redis redis