什么是docker,转自百度百科:
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker里的三个概念:仓库 => 镜像 => 容器
从仓库中拉取镜像(images),运行镜像成为一个容器(本质上是一个进程)。
镜像与容器的关系类似java里的类和对象。
镜像在主机的存储利用了联合文件系统和分层存储机制(系统 => 镜像 => 容器)。镜像不可修改,容器可以修改,保证了一个镜像可以运行为多个不同的容器,独立运行且互不干扰。
拉取镜像命令:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
OPTIONS为参数,可运行docker pull --help
来查看具体的参数及含义。[TAG]表示版本,默认为latest,最新版。NAME为容器名称。
我之前有过几篇文章从仓库拉取一些镜像,直接使用的docker run命令,如果本地没有这个镜像,会自动去仓库拉取,run命令包括了docker pull这个操作。
查看镜像命令:
docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS为参数,也可通过help来查看不同参数的含义。REPOSITORY为镜像名称,TAG为版本。
比如我运行:
docker images rabbitmq:latest
就是查看最新版rabbitmq的镜像,在我这里结果为空,因为我没有这个镜像。
运行一个docker容器:
docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]
OPTIONS仍为参数,可以通过help查看。常用的几个参数有:
-d 后台运行容器
-p 将容器端口与主机端口进行映射
-e 运行时指定环境变量(x=y这种格式)
比如我运行我之前安装过的rabbitmq镜像命令如下:
docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.7.3-management
-p我映射了两个端口,一个是rabbitmq端口,一个是管理界面的端口。镜像名称为rabbitmq,版本为3.7.3-management
在运行的容器中执行命令:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
CONTAINER为运行容器的id,可通过docker ps
命令来查看。
比如进入nginx容器执行脚本,就可以用到exec命令了。
停止容器:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
CONTAINER为运行容器的id,可通过docker ps
命令来查看。
我的第一个简易docker容器
刚才说的镜像都是从docker仓库中拉取的,如果我们想把自己的代码发布到docker上,就要自己定义镜像,需要编写Dockerfile。Dockerfile是镜像制作的操作文件,也可以说是容器运行的说明书。
这里我使用了自己的一个简单的eureka单点工程,一个很简单的服务注册中心,application.yml如下:
eureka:
client:
service-url:
defaultZone: http://eureka1:8761/eureka/
register-with-eureka: false
fetch-registry: false
server:
enable-self-preservation: false
spring:
application:
name: eureka
server:
port: 8761
我先在/etc/hosts文件中把本地ip映射到了eureka1上。
然后在IDEA自带的终端里运行mvn clean package -Dmaven.test.skip=true
命令进行项目打包,跳过测试方法。
我在自己的虚拟机的/root目录下新建了一个目录,把jar包传到了里面,在jar包所在目录下运行vi Dockerfile
对Dockerfile进行编写:
FROM java:8-alpine
ADD *.jar app.jar
EXPOSE 8761
ENTRYPOINT ["java","-jar","/app.jar"]
FROM java:8-alpine,该容器是springboot工程,需要依赖java运行环境,所以先把java的镜像引入进来,版本为8-alpine,然后将jar包添加到镜像中,因为目录下只有一个jar包,所以简写为 *.jar,镜像中的名称为app.jar。端口为8761,最后一行为运行jar包的命令。
运行docker build命令进行镜像制作:
docker build -t eurekademo1 .
镜像名称为eurekademo1,"."表示按照当前目录下的Dockerfile进行镜像生成。
我的环境里没有java镜像,所以docker会自动先去安装我指定版本的java镜像,然后进行生成,反正就很方便。
镜像生成后,运行:
docker run -d -p 8761:8761 eurekademo1
启动容器,端口为8761,镜像为eurekademo1。
执行docker images
和docker ps
来查看镜像和容器是否已存在。我比较懒,就不放截图了。
算了还是放吧,真香:
打开浏览器,输入虚拟机ip:8761
访问eureka中心,容器运行成功:
我想看springboot在控制台中打印的日志,可以运行如下命令:
docker logs -f 55c2a005d0c6
其中55c2a005d0c6为我的容器id:
这样我的第一个简易docker容器就大功告成了。