Docker教程
Docker简介
1.Docker是什么?
Docker 是一个便携的应用容器,Docker 当你需要在容器内运行自己的应用(当然可以是任何应用),Docker 都提供了一个基础系统镜像作为运行应用时的基础系统。也就是说,只要是 Linux 系统上的应用都可以运行在 Docker 中,也可以实现虚拟化。
2.Docker能干什么?
- 更快速的交付和部署
- 自动化测试和持续集成、发布。
- 允许实例简单、快速地扩展。
3.Docker特点
- 轻量,体现在内存占用小,高密度
- 快速,毫秒启动
- 隔离,沙盒技术更像虚拟机
Docker 入门
1.Docker基本概念
镜像(Image),容器(Container),仓库(Repository)
- 镜像:我们可以理解为一个预配置的系统光盘,这个光盘插入电脑后就可以启动一个操作系统。当然由于是光盘,所以你无法修改它或者保存数据,每次重启都是一个原样全新的系统。Docker 里面镜像基本上和这个差不多。
- 容器:同样一个镜像,我们可以同时启动运行多个,运行期间的产生的这个实例就是容器。把容器内的操作和启动它的镜像进行合并,就可以产生一个新的镜像。
- 仓库:Docker 使用类似 git 的方式管理镜像。通过基本的镜像可以定制创建出来不同种应用的 Docker 镜像。Docker Hub 是 Docker 官方提供的镜像中心。在这里可以很方便地找到各类应用、环境的镜像。由于 Docker 使用联合文件系统,所以镜像就像是夹心饼干一样一层层构成,相同底层的镜像可以共享。所以 Docker 还是相当节约磁盘空间的。要使用一 个镜像,需要先从远程的镜像注册中心拉取,这点非常类似 git。
2.Docker思想
集装箱
标准化:①运输方式 ② 存储方式 ③ API接口
隔离
3.Docker组件
- docker Client客户端————>向docker服务器进程发起请求,如:创建、停止、销毁容器等操作
- docker Server服务器进程—–>处理所有docker的请求,管理所有容器
- docker Registry镜像仓库——>镜像存放的中央仓库,可看作是存放二进制的scm
Docker安装
1.在 CentOS 7 上安装 Docker
使用 yum 从软件仓库安装 Docker
yum install docker
启动 Docker 的守护进程
service docker start
如果想要 Docker 在系统启动时运行,执行
chkconfig docker on
查看是否安装成功
docker --version
2.Docker中配置国内镜像
使用vi修改 /etc/docker/daemon.json 文件
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
配置完之后执行下面的命令,以使docker的配置文件生效
systemctl daemon-reload
systemctl restart docker
docker info可以查看到修改过的配置
Registry Mirrors:
http://hub-mirror.c.163.com
Image镜像
1.获取镜像
可以使用 docker pull
命令来从仓库获取所需要的镜像
//获取tomcat镜像
docker pull tomcat
2.列出本地镜像
docker images
- 来自于哪个仓库
- 镜像的标记
- 它的
ID
号(唯一) - 创建时间
- 镜像大小
TAG
信息用来标记来自同一个仓库的不同镜像。如果仓库中有多个镜像,通过 TAG
信息来区分发行版本。
启动时,如果不指定具体的标记,则默认使用 latest
标记信息。
3.搜寻镜像
使用docker search命令可以搜索远端仓库中共享的镜像
支持的参数包括:
--automated=false仅显示自动创建的镜像。
--no-trunc=false输出信息不截断显示。
-s, --stars=0指定仅显示评价为指定星级以上的镜像。
//列出星级大于30的Redis镜像
$ docker search -s=30 redis
4.创建镜像
创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。
该方法主要是使用docker commit命令,其命令格式为docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要选项包括:
-a, --author="“作者信息。
-m, --message=”"提交消息。
-p, --pause=true提交时暂停容器运行。
-
修改已有镜像
先使用下载的镜像启动容器,并在其中进行修改操作,例如创建一个test文件,之后退出:
[root@hadoop100 ~]# docker run -ti docker.io/centos /bin/bash [root@52c1d97c3620 /]# touch test [root@52c1d97c3620 /]# exit
注意:记住容器的 ID52c1d97c3620,稍后还会用到.
使用docker commit命令来提交为一个新的镜像。提交时可以使用ID或名称来指定容器:
[root@hadoop100 ~]# docker commit -m "touch test" -a "Docker Newbee" 52c1d97c3620 test 3696dc64a0333c2ae40d510a57dcf9ce6aa383fba8f8240cf61795e3c39cf284
其中,
-m
来指定提交的说明信息,跟我们使用的版本控制工具一样;-a
可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息此时查看本地镜像列表,即可看到新创建的镜像:
[root@hadoop100 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test latest bd3ba467e348 6 seconds ago 200 MB
-
利用 Dockerfile 来创建镜像
使用
docker commit
来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用docker build
来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。新建一个目录和一个 Dockerfile
$ mkdir test2 $ cd test2 $ touch Dockerfile
Dockerfile 中每一条指令都创建镜像的一层,例如:
# This is a comment FROM centos MAINTAINER Docker Newbee <newbee@docker.com> RUN apt-get -qq update RUN apt-get -qqy install ruby ruby-dev RUN gem install sinatra
Dockerfile 基本的语法是
- 使用
#
来注释 FROM
指令告诉 Docker 使用哪个镜像作为基础- 接着是维护者的信息
RUN
开头的指令会在创建中运行,比如安装一个软件包,在这里使用 apt-get 来安装了一些软件
编写完成 Dockerfile 后可以使用
docker build
来生成镜像 - 使用
$ docker build -t="test2" .
其中 -t
标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。
此外,还可以利用 ADD
命令复制本地文件到镜像;用 EXPOSE
命令来向外部开放端口;用 CMD
命令来描述容器启动后运行的程序等。
# put my local web site in myApp folder to /var/www
ADD myApp /var/www
# expose httpd port
EXPOSE 80
# the command to run
CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]
-
从本地文件系统导入
可以直接从一个操作系统模板文件导入一个镜像。在这里,推荐使用OpenVZ提供的模板来创建。OPENVZ模板的下载地址为
http://openvz.org/Download/templates/precreated
。比如,下载了一个ubuntu-14.04的模板压缩包后,可以使用以下命令导入:
$ sudo cat ubuntu-14.04-x86_64-minimal.tar.gz |docker import - ubuntu:14.04
5.存出和载入镜像
-
存出镜像
如果要导出镜像到本地文件,可以使用
docker save
命令$ sudo docker save -o ubuntu_14.04.tar ubuntu:14.04
- 载入镜像
可以使用
docker load
从导出的本地文件中再导入到本地镜像库$ sudo docker load --input ubuntu_14.04.tar
或
$ sudo docker load < ubuntu_14.04.tar
6.移除本地镜像
移除本地的镜像,可以使用 docker rmi
命令。注意 docker rm
命令是移除容器
//移除指定镜像
$ docker rmi test
//移除所有镜像
$ docker rmi $(docker images -q)
*注意:在删除镜像之前要先用 docker rm
删掉依赖于这个镜像的所有容器。
用-f
可以强制删除
7.上传镜像
可以使用docker push命令上传镜像到仓库,默认上传到DockerHub官方仓库(需要登录),命令格式为docker push NAME[:TAG]
用户在DockerHub网站注册后,即可上传自制的镜像。例如用户user上传本地的test:latest镜像,可以先添加新的标签user/test:latest,然后用docker push命令上传镜像:
$ sudo docker tag test:latest user/test:latest
$ sudo docker push user/test:latest
Docker容器
1.启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。
-
新建并启动
命令为
docker run
//启动centos $ docker run -t -i --name centos-test centos
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上-i
则让容器的标准输入保持打开。--name
用来指定容器的启动名 -
启动已终止容器
利用
docker start
命令,直接将一个已经终止的容器启动运行$ docker start centos-test(容器id或容器名)
2.守护态运行
让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d
参数来实现
$ docker run --name -d centos-test2 centos
3.终止容器
使用 docker stop
来终止一个运行中的容器
$ docker stop centos-test(容器id或容器名)
4.进入容器
在使用 -d
参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,可以使用docker attach
命令。
$ docker attach centos-test
5.退出终端
- 通过
exit
命令或Ctrl+d
来退出终端时,所创建的容器立刻终止。 - 通过
Ctrl+q+p
来退出终端时,所创建的容器不会终止。
6.导出和导入容器
使用 docker export
命令
$ docker export 7691a814370e > centos.tar
使用 docker import
从容器快照文件中再导入为镜像
$ cat centos.tar | sudo docker import - test/centos:v1.0
7.删除容器
使用 docker rm
来删除一个处于终止状态的容器
//删除指定容器
$ docker rm centos-test
//删除所有容器
$ docker rm $(docker ps -a -q)
-f
可以强制删除
8.端口映射
-p
可以进行端口的映射,用来暴露给外部访问
$ docker run -d -p 8081:8080 --name tomcat tomcat
9.容器日志
//查看该容器名或id的日志
$ docker logs tomcat(容器名或容器id)
10.容器列表
//查看运行的容器列表
$ docker ps
//查看运行和停止的容器
$ docker pa -a
Springboot项目云部署
首先在本机进入项目目录下,使用命令mvn package对项目进行打包,这里选择的打包方式为jar。
接下来将jar文件上传到linux服务器上部署,首先在项目jar文件同级目录下创建一个Dockerfile文件,因为 Docker是使用Dockerfile文件来编译自己的镜像的。
文件的内容如下:
FROM java:8
MAINTAINER wyq
ADD springboot-helloworld-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
文件内容解释:
1、基镜像为JAVA 版本为8
2、作者名字
3、将项目添加到镜像中,并重命名为app.jar
4、运行镜像文件,监听端口为8080
5、启动时运行java -jar app.jar
其中使用Dockerfile文件中的命令有很多,这里简单的介绍下
FROM 命令
FROM 指令知名了当前镜像继承的基镜像,编译当前的镜像是会自动下载基镜像。FROM centos
MAINTAINER 指令
MAINTAINER 指令指明了当前镜像的作者MAINTAINER wyq
RUN指令
RUN指令可以在当前镜像上执行linux命令,并形成一个新的层(编译时动作)RUN /bin/bash -c "echo helloworld" 或 RUN ["/bin/bash", "-c", "echo hello"]
CMD指令
CMD指令指明了启动镜像容器时的默认行为,该指令在Dockerfile中唯一(运行时动作)CMD echo “this is a test”
EXPOSE 指令
EXPOSE知名了镜像运行时的容器必需监听指定的端口EXPOSE 8080
ENV指令
ENV指令可以用来设置环境变量ENV myName=will
ADD指令
ADD指令是从当前工作目录复制文件到镜像文件中ADD text.txt /mydir/
ENTRYPOINT 指令
RNTRYPOINT 指令可以让容器像一个可执行程序一样运行,并接受参数执行RNTRYPOINT ["/bin/echo"]
接下来编译镜像,在上面的目录下执行下面的命令:
docker build -t test/dockerdemo .
其中test/dockerdemo 为镜像名称,其中test为docker镜像的命名习惯,最后的 . 表示Dockerfile在当前路径下。
然后运行镜像
docker run -d --name dockerdemo -p 8080:8080 test/dockerdemo
最后通过访问服务器,可以看到项目的成功部署.