简单介绍Docker容器
容器类似于windows下的VMware、Hyper-V装的虚拟机;
但docker由linux系统实现虚拟化,完整资源隔离;可以快速部署启动应用;一次编写,四处运行(有一定的限制,比如Docker是基于Linux 64bit的,无法在32bit的 linux/Windows/unix环境下使用)
安装Docker容器
windows下安装docker请看这里
linux下安装docker请看这里
Docker基础命令
查看docker安装包:yum list | grep docker
安装Docker Ce 社区版本:yum install -y docker-ce.x86_64
设置开机启动:systemctl enable docker
更新xfsprogs:yum -y update xfsprogs
启动docker:systemctl start docker
查看版本:docker version
查看详细信息:docker info
Docker镜像的"增删改查"
查看本地镜像:docker images
搜索镜像:docker search centos
搜索镜像并过滤是官方的: docker search --filter "is-official=true" centos
搜索镜像并过滤大于多少颗星星的:docker search --filter stars=5 centos
下载centos7镜像:docker pull centos:7
下载mysql5.7镜像:docker pull mysql:5.7
修改本地镜像名字(小写):docker tag centos:7 mycentos:1
本地镜像的删除:docker rmi centos:7
本地镜像的强制删除:docker rmi -f centos:7
Docker容器的"增删改查"
构建容器:docker run -itd --name=mycentos centos:7
-i :表示以交互模式运行容器(让容器的标准输入保持打开,一般与-t成对出现)
-t:为容器重新分配一个伪输入终端
-d:表示后台运行容器,并返回容器ID
--name:为容器指定名称
查看本地所有的容器:docker ps -a
查看本地正在运行的容器:docker ps
停止容器:docker stop CONTAINER_ID / CONTAINER_NAME
一次性停止所有容器:docker stop $(docker ps -a -q)
启动容器:docker start CONTAINER_ID / CONTAINER_NAME
重启容器:docker restart CONTAINER_ID / CONTAINER_NAME
删除容器:docker rm CONTAINER_ID / CONTAINER_NAME
强制删除容器:docker rmi -f CONTAINER_ID / CONTAINER_NAME
查看容器详细信息:docker inspect CONTAINER_ID / CONTAINER_NAME
查看容器的挂载信息:docker inspect CONTAINER_ID / CONTAINER_NAME |grep Mounts -A 20
进入容器:docker exec -it CONTAINER_ID /bin/bash
Docker容器与宿主机之间文件复制
从宿主机复制到容器:docker cp 宿主机本地路径 容器名字/ID:容器路径
docker cp /root/demo.txt mycentos:/home/
从容器复制到宿主机:docker cp 容器名字/ID:容器路径 宿主机本地路径
docker cp mycentos:/home/demo.txt /root
宿主机文件夹挂载到容器里
docker run -itd -v 宿主机路径:容器路径 镜像ID
#例子 启动centos:7镜像,并将宿主机/root/demo目录挂载到容器的/home,此操作可以简单理解为 快捷方式,
即/root/demo相当于/home的快捷方式,/home也相当于/root/demo的快捷方式,目录下内容共享
docker run -itd -v /root/demo/:/home centos:7
本地镜像与容器的载入载出
俩种方法:
保存镜像
保存容器
#保存镜像(此种方法镜像ID不会改变):
docker save ed3ed0dfrf7e -o /home/mysql.tar
docker save mysql:5.7 > /home/mysql.tar
#载入镜像:
docker load -i mysql.tar
#保存容器(此种方法镜像ID会改变):
docker export f7rb919e1fdv -o /home/mysql-export.tar
#载入容器:
docker import mysql-export.tar
Commit构建自定义镜像
简介:对容器特定修改后,保存为镜像
#命令 假设 1786256gd4fv 为容器ID,此时构建镜像:
## 第一种方式:
docker commit 1786256gd4fv mycentos:7
## 第二种方式:
docker commit -a "WL" -m "mkdir /home/liwang" 2eb9drr4fbb1c mcentos:7
-a:标注作者
-m:说明注释
实际中构建操作演示
## 启动并进入容器:
docker run -it centos:7 /bin/bash
## 在/home 路径下创建xdclass文件夹:
mkdir /home/liwang
## 安装ifconfig命令:
yum -y install net-tools
## 重启容器,查看容器的 liwang 文件夹还在不在->(在):
docker restart 1786256gd4fv
## 构建镜像1786256gd4fv,起名为 mycentos:7 :
docker commit 1786256gd4fv mycentos:7
docker commit -a "WL" -m "mkdir /home/liwang" 1786256gd4fv mcentos:7
-a:标注作者
-m:说明注释
## 删除容器,再重新使用centos:7启动一个容器进入查看有没有 liwang 文件夹->(无):
docker rm -f 1786256gd4fv && docker run -it centos:7 /bin/bash
## 重新使用mcentos:7启动一个容器进入查看有没有 liwang 文件夹->(有):
docker run -it mycentos:7 /bin/bash
查看详细信息:docker inspect 1786256gd4fv
启动容器:docker run -itd 1786256gd4fv /bin/bash
进入容器查看:docker exec -it 1786256gd4fv /bin/bash
Dockerfile构建镜像
Dockerfile基础指令
FROM -> 基于哪个镜像
MAINTAINER -> 注明作者
COPY -> 复制文件进入镜像(只能用相对路径,不能用绝对路径)
ADD -> 复制文件进入镜像(假如文件是.tar.gz文件会解压, .sql会执行)
WORKDIR -> 指定工作目录,假如路径不存在会创建路径
ENV -> 设置环境变量
EXPOSE -> 暴露容器端口(一般是用来 标注 此容器需要对外暴露的端口, 一般在运行容器时 用-p映射,-p加上制定映射端口则映射制定端口,如-p后无指定端口,则映射EXPOSE所有端口,但宿主机端口随机)
RUN -> 在构建镜像的时候执行,作用于镜像层面
ENTRYPOINT -> 在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
CMD -> 在容器启动的时候执行,作用于容器层,dockerfile里有多条时只允许执行最后一条
容器启动后执行默认的命令或者参数,允许被修改,例如 "docker run -it mycentos:7 /bin/bash",此时"/bin/bash"即为CMD
命令格式:
shell命令格式:RUN yum install -y net-tools
exec命令格式:RUN [ "yum","install" ,"-y" ,"net-tools"]
创建一个简易的Dockerfile
# this is a simple dockerfile
FROM openjdk:8-jre
MAINTAINER LW 123456@qq.com
RUN echo "正在构建镜像!!!"
WORKDIR /home/liwang
COPY 123.txt /home/liwang
RUN yum install -y net-tools
# 复制jar文件到路径
COPY ./jar/helloworld.jar /home/liwang/helloworld.jar
# 启动helloworld服务
ENTRYPOINT ["java","-Dfile.encoding=utf-8","-jar","helloworld.jar"]
构建dockerfile
#在dockerfile同级执行
docker build -t helloworld:v1 .
#查看:
docker images
#进入验证
docker run -itd helloworld:v1 /bin/bash
镜像分层结构剖析
共享资源
对容器的任何改动都是发生容器层
容器层是可写可读,而镜像层只读