docker的两个最重要概念是镜像和容器,他们的关系你可以把镜像想成是一个类,容器是根据某个类制造的对象。接下来我们看下有关镜像和容器的基本命令。
安装:
1.查看一台机器是否安装过docker
yum list installed | grep docker
如果显示如下所示表示之前安装过
docker.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos
docker-client.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos
docker-common.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos
2.如果安装过docker的机器需要先卸载
sudo yum remove -y docker-ce.x86_64 docker-client.x86_64 docker-common.x86_64 //卸载
sudo rm -rf /var/lib/docker //删除容器镜像
sudo yum install docker-ce //安装docker
3.没有安装过docker的机器安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2 //安装依赖包
yum-config-manager --add-repo mirrors.aliyun.com/docker-ce/l… //设置阿里云镜像
vi /etc/yum.repos.d/docker-ce.repo
:%s/releasever改为你操作系统版本
yum install docker-ce //安装社区版docker
4.设置开启自启动
systemctl enable docker
systemctl start docker
镜像:
1.获取镜像(可以从Docker公共仓库获取就跟maven的公服一样,也可以从私有仓库获取就跟maven私服一样)
从Docker Hub仓库下载一个ubutu 12.04的镜像:
docker pull ubutu:12.04
从指定仓库下载镜像:
docker pull www.baidu.com:8080/ubuntu:12.0…
2.查看本地所有镜像
docker images
3.删除镜像
docker rmi 镜像名称/镜像id
4.备份镜像
docker save -o ubuntu_14.04.tar ubutu:14.04
5.导入镜像
docker load --input ubuntu_14.04.tar
6.自己制作镜像
从老镜像生成:
1.先使用下载的镜像启动容器 docker run -t -i centos /bin/bash
2.安装一些东西 exit退出
3.提交副本 docker commit -m "安装了json" -a "phxy23" 老容器ID test:v1 -m 提交信息 -a 提交人 创建镜像的容器id 目标镜像的仓库名和tag
4.用新镜像启动容器 docker run -t -i test:v1 /bin/bash
利用Dockerfile文件来创建镜像:
这个是开发关注的点,也就是将我们的项目变成一个镜像然后在docker容器中启动部署,于是Dockerfile文件的语法就很必要学习,在文段末尾可以查看Dockerfile文件语法。
7.将镜像上传到harbor
docker login -u 用户名 -p 密码 harbor的ip:端口
docker build -t harbor的ip:端口/路径/镜像名:tag .
docker push harbor的ip:端口/路径/镜像名:tag
容器:
1.查看本地所有容器
docker ps -a
2.守护态运行容器
docker run -d unbuntu:14.04 /bin/sh -c "while true;do echo hello world;sleep 1;done"
3.进入容器
docker exec -it 容器id /bin/bash
如果提示没有权限,指定用户进入:
docker exec-it --user=root **容器id /bin/bash
4.停止容器
docker stop 容器名
5.启动终止容器
docker start 容器名
6.删除容器
docker rm 容器名
7.查看容器启动日志
docker logs 容器名
8.查看容器详细信息
docker inspect dockerId
9.备份容器
docker export 容器id > mycontainer.tar
10.导入容器
docker import mycontainer.tar test/unbuntu:v1.0
11.查看容器占用资源情况
docker stats
docker持久化:
任何技术都要考虑持久化方面,docker里有数据如果不持久化就可能会丢失。
docker是通过数据卷技术实现持久化的。
1.通过命令添加数据卷
docker run -it -v /宿主机绝对路径目录:/容器内绝对路径目录 镜像名
如果省略宿主机路径,只写容器内的数据卷路径,这时候docker会在/var/lib/docker/volumes/目录下自行创建一个目录。
一个目录可以被多个容器挂载为数据卷,从而实现容器间的数据同步和共享
并且可以设置数据卷的读写权限,默认是rw有读写权限,ro只有读权限
一个容器挂载一个数据卷:
docker run -it -v /var/localspace/workspace/suzhu:/rongqi ubuntu
一个容器挂载多个数据卷:
docker run -it -v /suzhu1:/rongqi1 -v /shuzhu2:/rongqi2 ubuntu
设置数据卷的读写权限:
docker run -it -v /suzhu:/rongqi:ro ubuntu
2.通过dockerFile添加数据卷
VOLUME ["数据卷目录1","数据卷目录2"]
不同平台下路径格式不同,不能指定宿主机的目录,通过dockerFile创建的数据卷都默认存在于/var/lib/docker/volumes/目录下。
FROM ubuntu
VOLUME ["/data1","/data2"]
CMD echo "Success to build volume"
CMD /bin/bash
3.数据卷容器
一些经常性发生变化的数据需要在多个容器之间进行共享
使用数据卷容器更好,本身也是一个容器,其他容器可以挂载自己。
1.创建数据卷容器
docker run -it -v /dbdata --name dbContainer ubuntu
2.其他容器挂载数据卷容器
docker run -it --volumes-from dbContainer --name c1 ubuntu
并且挂载过数据卷的容器可以被其他容器挂载
docker run -it --volumes-from c1 --name c2 ubuntu
docker网络通信:
任何技术网络通信都是绕不过去的一个基础功能,我们不讲原理简介下使用。
1.容器端口暴露
docker run -itd --expose 80 ubuntu
2.容器端口和操作系统端口映射
docker run命令启动容器,通过-p或-P参数来指定端口映射。-p手动指定映射端口,宿主机的一个端口只能绑定一个容器,-P是随机映射一个49000-49900端口到容器端口
-p:
docker run -itd -p 5000:80 nginx
-p参数可以绑定多个端口:
docker run -itd -p 5001:5001 -p 5002:5002 nginx:latest
带上宿主机ip:
docker run -itd -p 10.0.2.15:8081:8081 nginx
-p带上宿主机ip随机映射端口:
docker run -itd -p 10.0.2.15::8088 nginx:latest
-P:
docker run -d -P nginx:latest
3.容器互联
基于端口映射外的另一种容器通信手段。
docker run -d --name nginx_server nginx
docker run -it --name nginx_client --link nginx_server:nginx_server ubuntu
Dockerfile语法:
简单案例:
1.创建一个Dockerfile文件
touch Dockerfile
2.填写文件内容
This is a comment
FROM ubuntu:14.04
MAINTAINER phxy23 phxy23@example.com
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
复制文件到镜像
ADD a.txt /var
开放端口
EXPOSE 80
语法:
使用#来注释
FROM告诉docker使用哪个镜像作为基础
接下来是维护者信息
RUN开头的指令会在创建中运行
3.生成镜像
docker build -t="test:v1" /usr/local/workspace
Dockerfile的13条指令语法:
1.FROM
FROM image或者FROM image:tag
第一条指令必须为FROM指令
2.MAINTAINER
指定维护者信息
MAINTAINER phxy23 phxy23@example.com
3.RUN
RUN command或者 RUN ["executable","param1","param2"]
RUN command将在shell中运行命令,即/bin/sh -c
RUN ["executable","param1","param2"]可以指定位置
RUN ["/bin/bash","-c","echo hello"]
4.CMD
CMD ["executable","param1","param2"]或者CMD command param1 param2或者CMD ["param1","param2"]
指定启动容器时执行的命令,每个Dockerfile只能执行一个CMD命令,能被docker run参数覆盖
5.EXPOSE
容器暴露端口
expose 80
6.指定环境变量
ENV key value
指定一个环境变量,会被后续RUN指令使用
ENV PATH /usr/local/bin:$PATH
ENV PG_VERSION 9.3.4
7.ADD
ADD src dest
复制源路径到容器的dest路径
8.COPY
COPY src dest
复制源路径到容器的dest路径
9.ENRYPOINT
ENTRYPOINT ["executable","param1","param2"]或者ENTRYPOINT command param1 param2
只执行一个ENTRYPOINT命令,不能被docker run参数覆盖
10.VOLUME
VOLUME ["/data"]
创建数据卷
11.USER
管理用户权限的
12.WORKDIR
切换目录
WORKDIR /path/to/workdir
13.ONBUILD
配置当前所创建镜像作为其他新建镜像的基础镜像时,所执行的操作指令。
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
假设创建了镜像A
如果基于镜像A创建新的镜像时,新的Dockerfile使用FROM imageA指定基础镜像时,会自动执行ONBUILD指定的内容,等价于在后面添加了两条指令。
Docker-compose:
介绍:
Docker compose是一个用来定义和运行复杂应用的Docker工具。
一个使用Docker容器的应用,通常由多个容器组成,使用Docker Componse就不再需要使用shell脚本来启动容器。
componse通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动、停止和重启应用。
安装:
下载:
curl -L get.daocloud.io/docker/comp… -s-uname -m` > /usr/local/bin/docker-compose
添加可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
查看版本:
docker-compose --version
简单案例:
目录结构:
└── compose_test
├── docker
│ └── docker-compose.yml
├── Dockerfile
└── src
├── app.py
└── requirements.txt
src目录下假设是我们的源码文件,docker-compose.yml是docker-compose配置文件:
version: '3'
services:
web:
build: ../
port:
- "5000:5000"
redis:
image: redis:3.0.7
这个compose文件中就定义了两个服务,web和redis两个,需要两个容器部署。
部署:
在compose_test/docker目录下执行命令:
docker-compose up -d
部署完成
快速上手(将springboot的jar包部署到docker):
1.生成自己项目的jar包并上传服务器
2.在同路径下新建文件Dockerfile
FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY xxx.jar xxx.jar
ENTRYPOINT ["java","-jar","/xxx.jar"]
执行命令:
docker build -t xxx:v1 .
3.查看自己镜像的imageId
docker images
4.部署到容器
docker run --name=容器名 -d -p 8082:8082 imageId