1,Docker原理与执行命令
Docker官网地址: docker.com
安装命令(博主很懒,自行百度吧!!!):
1, yum install -y yun-utils device-mapper-persistent | vm2
2, systemctl start docker ## 启动docker
3, systemctl enable docker ## 开机启动
4, docker version ## 查看docker的版本
Docker基本命令:
1, docker pull 镜像名称<:tags> ## 从远程仓库拉取镜像,无版本号时默认最新
2, docker run 镜像名称<:tags> ## 启动docker, run包含了pull
3,docker build 构建
4, docker images ## 查看本地的全部镜像
5, docker ps ## 查看正则运行中的镜像,即docker实例
6, docker rm <-f> 容器id ## 删除容器
7, docker rml <-f> 镜像名称:<tags> ## 删除镜像
Docker命令升级:
1, docker run -p 8000:8080 tomcat<:tags> ## 宿主机:8000 容器:8080
2, docker run -p 8000:8080 -d tomcat<:tags>
3, docker build -t 机构/镜像名<:tags> DockerFile目录 ## 根据文件构建docker镜像
4, docker run -d --name web 镜像名称 ## --name 容器赋予名称
5, docker inspect 容器ID ## 查看容器的元数据,如容器ID
## link 链接到另外的容器,个人理解类似于hostname,可以ping通
6, docker run -d --name web --link database tomcat ## 链接到容器名称为database容器
使用阿里云的镜像加速服务,提高镜像的下载速度.
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://000-9gvomlv7.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2,Docker-compose快速部署Docker应用
宿主机&&端口映射
Docker启动之后,类似与一台Linux服务器,页拥有自己的IP,如何与外部通信?比如启动tomcat之后,默认为8080端口,如何能访问到了,端口映射则解决这样的问题。
容器的生命周期
1, docker create 镜像名称[:tags] ## 创建容器,根据镜像创建容器,注意创建的是容器
2, docker start 容器id ## 运行容器
3, docker pause 容器id ## 暂停容器,注意用docker ps -a 查看容器的状态
4, docker stop/kill 容器id ## 停止容器
构建Dockerfile
## 以tomcat为基础构建
FROM tomcat:latest
## 拥有者
MAINTAINER XXOO.com
## 切换工作目录,不存在则创建
WORKDIR /usr/local/tomcat/webapps
## docker-web:Dockerfile同级目录, ./docker-web复制到工作目录下,不存在则创建
## 将同级docker-web目录的内容复制到工作目录docker-web下
ADD docker-web ./docker-web
注释: 理解docker分层级临时镜像.
Dockerfile基础命令
1, FROM 尽量使用官方提供的Base image
- FROM centos ## 制作基准镜像(基于centos:lastest)
- FROM scratch ## 不依赖任何基准镜像base image
- FROM tomcat:tags
2, LABEL && MAINTAINER 说明信息
- MAINTAINER 机构名称
- LABEl version = "1.0"
- LABEL description = "描述信息"
3, WORKDIR 设置工作目录,尽量使用绝对路径
- WORKDIR /usr/local
- WORKDIR /usr/local/nerdir ## 自动创建
4, ADD && COPY 复制文件
- ADD hello / ## 复制到跟路径
- ADD test.tar.gz ## 添加到根目录并解压
- ADD 除了复制,还具备添加远程文件的功能
5, ENV 设置环境常量
- ENV JAVA_HOME /usr/local/openjdk8
- RUN ${JAVA_HOME}/bin/java -jar test.jar
- 尽量使用环境常量,提高程序的维护性
6, RUN 容器构建时运行,建议采用Exec的方式
- RUN yum install -y vim ## Shell 命令格式
- RUN ["yum","install","-y","vim"] ## Exec命令格式
7, ENTRYPOINT启动命令,容器启动时执行的命令
- ENTRYPOINT(入口点)用于在容器启动时执行的命令
- Dockerfile中只有最后一个ENTRYPOINT会被执行
- ENTRYPOINT ["ps"] ## 推荐使用Exec格式
8,CMD 默认命令. ENTRYPOINT 和 CMD可组合使用
- CMD用于设置默认执行的命令
- 如Dockerfile中出现多个CMD,则只有最后一个被执行
- 如容器启动时附加指令,则CMD被忽略
- CMD ["ps","-ef"] ## 推荐使用Exec的格式
9, EXPOSE
创建Dockerfile文件如下:
FROM centos
RUN ["echo","image building"]
CMD ["echo","container starting"]
构建: 末尾的.指定Dockerfile的位置
docker build -t hello.com/centos:1.0 .
总结: Dockerfile中ENTRYPOINT命令一定会被执行,而CMD不一定会被执行,
当启动容器时附加的命令会覆盖Dockerfile文件中的CMD命令. 也就是内部执行最后一条命令,但是
外部如果存在,则会覆盖内部的的命令。
源文件构建-redis 注意: /bin/bash目录
Shell和Exec方式区别
3,容器间单向通信
[root@localhost ~]# docker network create -d bridge my-bridge
07a7a182d22cb96df0aa237219b70036c8e69d74e66de535a634efa790ac0f49
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
b63e770ed0e6 bridge bridge local
c89642d26a66 host host local
07a7a182d22c my-bridge bridge local
75834e8c0240 none null local
docker network connect 网络名称(如上图中my-bridge) 容器名称
容器间共享数据,通过volume挂载的方式:
-v 主机目录:容器目录
1, 每个容器都与主机挂载
2, 创建一个容器,用于挂载
Docker compose(单机)/Docker swarm(集群)/K8S(集群)