Docker基本使用

271 阅读7分钟

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/7/ge//releasever/7/ge //将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