Docker入门
Linux Containers Linux容器 缩写LXC,其对进程进行隔离,而非一个完整的操作系统。Docker属于LXC的一种封装,提供简单易用的容器使用接口。Docker主要用于提供一次性环境、提供 弹性的云服务、组件微服务架构。
一、基本操作
1.1 Docker安装
Docker是一个开源的开品,有两个版本:CE(Community Edition)和EE(Enterprise Edition)。企业版包含一些收费服务,社区版适合个人开发者。
安装完成后,使用如下命令验证是否安装成功:
1 |
|
Docker需要用户具有sudo权限,为了避免每次输入sudo以及用户不具有sudo权限,请先使用管理员用户将特定的用户添加到Docker用户组:
1 |
|
Docker 是服务器—-客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动:
1 |
|
1.2 Docker镜像文件image
Docker将应用程序及其依赖打包在镜像(image)文件里,通常一个image会继承自另一个image,开发者在其中加入个性化的配置,从而形成定制化的镜像文件。
Docker通过image来生成并运行虚拟容器。比如说我们的网站程序打包成image文件并拷贝在一个服务器上,通过docker根据此image文件在服务器上生成并运行多个相同的网站程序。
通过Docker管理image文件:
1 |
|
image具备复用性,通常我们可以使用别人制作好的Image文件,这些共享镜像通常来自于Docker Hub。
1.3 Docker镜像实例
我们可以从Docker官方镜像仓库/第三方仓库拉取image文件并运行。
hello-world
从官方拉取hello-world镜像来感受下Docker:
1 |
|
- docker image pull:拉取镜像的命令
- library:镜像文件所在组
- hello-world:镜像文件的名字
Docker官方提供的镜像文件都在library下,因此library是默认镜像组,可省略不写:
1 |
|
1.4 Docker运行容器实例
基于image文件生成并运行容器:
1 |
|
输出一段话后,hello-world容器自动终止。
有些容器不会自动终止,因为它们提供的是服务例如网站容器和虚拟操作系统容器,运行ubuntu的容器,docker会从镜像仓库下载ubuntu的镜像,下载完成后直接从ubuntu镜像运行容器实例:
1 |
|
- -t: flag assigns a pseudo-tty or terminal inside the new container.
- -i: flag allows you to make an interactive connection by grabbing the standard in (STDIN) of the container.
- -it:Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器
- bash: launches a Bash shell inside our container.
输入exit或按Ctrl+D可退出此ubuntu容器实例进程,此种方式依赖命令行运行,命令行退出则容器进程终止(使用Ctrl+P+Q也可退出容器且不关闭容器)。使用ps命令查看docker进程,可见ubuntu的进程已退出:
1 |
|
也可以将将容器作为后台进程运行,再使用attach命令进入在后台运行的容器:
1 |
|
容器在后台运行成功,使用attach/exec命令进入后台进程的ubuntu容器:
1 |
|
容器进程退出,但容器文件依然存在,因此关闭容器不会删除容器文件。一些container常用命令:
1 |
|
二、自定义容器
使用Dockerfile来定制image,适应我们自己的需要。Dockerfile是一个文本配置文件,docker将根据它生成我们需要的image。
2.1 准备镜像所需的工程代码或文件
拉取测试代码:
1 |
|
在本地编译maven项目,mvn clean package编译出需要的war包。
也可基于maven镜像,在容器内构建maven项目,但需要令行配置
2.2 编写Docker配置文件
在此项目基础上构建Dockerfile项目,新建Dockerfile配置文件,内容如下:
1 |
|
FROM openjdk:8
基于openjdk8镜像编译自定义镜像
VOLUME /tmp
将本地文件夹挂载到当前容器
ADD
ADD ./target/maven-quiz.jar /app.jar 是拷贝war文件到容器
EXPOSE 8000
开放8000端口
ENTRYPOINT
ENTRYPOINT [“nohup”, “java”, “-Dserver.port=8000”, “-jar”, “/app.jar”, “&”]
配置容器启动后执行的命令,使用nohup使得java程序运行于后台,不至于命令行退出java程序终止。
- ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖,需谨记
- CMD,表示镜像运行默认参数,可被重写覆盖
- ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
- 需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!
ENTRYPOINT/CMD,一般两者可以配合使用,比如:
1 |
|
2.3 编译Docker镜像
编译命令如下:
1 |
|
- docker build 或 docker image build:编译命令
- -t:指定镜像的name,maven-quiz为镜像名,其后可加:来指定标签,默认为lastest
- .:指定Dockerfile配置文件所在路径,.即是当前路径
编译过程如下:
1 |
|
2.4 运行容器
运行命令如下:
1 |
|
-docker run:运行容器
- -p:指定本地:容器端口映射
- -itd:容器在后台运行
- maven-quiz:指定镜像,:后加标签,默认为lastest
参考
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://blog.csdn.net/zhezhebie/article/details/75501149
(完)