前言
一般情况下,我们中直接使用docker官网的库,就可以找到我们日常开发中需要的镜像,比如:ubuntu、tomcat、apache、nginx、php、mysql、redis、postgresql等等,但是如果docker库里没有我们需要的镜像呢。
docker库里已经存在的镜像操作都比较类似:如下,比如需要
1、先搜索目前已经存在在docker库里的不同版本不同类型的搜索镜像
docker search redis
2、然后pull下来:3.2是版本号
docker pull redis:3.2
当然你也可以修改本机和镜像映射的端口号:
这里我们以postgres为例:
1、docker安装postgresql
docker pull postgres:10
2、将docker中的数据库映射到主机的54321上
sudo docker run --name postgres -e POSTGRES_PASSWORD=123456 -p 54321:5432 -d postgres:10
--name,指定创建的容器的名字;
-e POSTGRES_PASSWORD=password,设置环境变量,指定数据库的登录口令为password;
-p 54321:5432,端口映射将容器的5432端口映射到外部机器的54321端口;
-d postgres:9.4,指定使用postgres:10作为镜像。
基础的自己制作镜像
这里我们通过Dockerfile的定义文件和docker build命令来构建镜像
这是一种推荐的构建镜像的方式,Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像。
制作镜像的方法:
1、随便新建一个目录,(解释:这个目录就是我们的构建环境,docker构建时,就会将构建环境的文件上传到docker的守护进程中。)在这个新建目录下新建一个文件Dockerfile,如下命令,并在文件中写入 # Version: 1.0.0...等数据。
gedit Dockerfile
# Version: 1.0.0 #指令从上往下执行,每条指令都会常见一个新的镜像层 #从哪个基础镜像运行一个容器 FROM ubuntu:latest #该镜像作者是谁,以及联系方式 MAINTAINER Bourbon Tian "bourbon@1mcloud.com" #RUN指令是指在当前镜像中运行的命令,更新APT仓库 RUN apt-get update #安装nginx包 RUN apt-get install -y nginx #在此目录下新建页面,并写入一点内容 RUN echo 'Hi, I am in your container' > /usr/share/nginx/html/index.html #指定80端口作为容器内应用程序的端口号。 EXPOSE 80
2、构建
sudo docker build -t="test/mydocker:new" ./mydocker
-t:是为新镜像设置仓库和名称,仓库:test/mydocker,
./mydocker就是docker镜像环境,会在这个目录根据Dockerfile构建镜像,这里也可以指定一个git地址。
:new是为镜像设置一个标签。
注意:如果安装失败,也就是没有出现下面步骤3类似的结果时,再次构建时需要清楚缓存,具体如下:
sudo docker build --no-cache -t="test/mydocker:new" ./mydocker
缓存作用:如果Dockerfile文件添加一行:
ENV HUANJINGBIANLIANG env_shi_shezhi_
huanjingbianliang
Docker在命中ENV指令时开始重置这个缓存,会运行这一行以后的指令。
3、验证
执行完步骤2中的操作,如果成功会返回类是如下的信息
Successfully built eaec01bc28a0 Successfully tagged mydocker:latest
带交互的运行,其中 eaec01bc28a0 就是你本次新建容器的id,可以使用一下命令运行这个容器
docker run -t -i eaec01bc28a0 /bin/bash
带交互的运行
sudo docker run -d -p 80 --name mydocker test/mydocker nginx -g "daemon off;"
-d:后台运行,
-p: 指定docker运行时公开哪些端口给主机,
nginx -g "daemon off;":是在容器内执行的命令。
这时候我们执行一下命令就可以看到容器80端口和主机哪端口已经映射
sudo docker ps -l
结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b25aa96fcb08 mydocker "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:32769->80/tcp mydocker于是乎我们在主机浏览器输入:http://localhost:32769/ 就可以看到ngnix主页了。当然这个主机映射端口随机生成的,我们也可以指定,停掉容器并删除镜像,删除镜像的命令是:rmi 后面加上镜像id,执行如下命令就ok。如果将p改为大写,会将Dockerfile文件中EXPOSE指令指定的其他端口也一并公开,此时访问就可以看到我们开始自己写的页面了。
sudo docker run -d -p 8099:80 --name mydocker test/mydocker nginx -g "daemon off;"
查看指定镜像:
docker images test/mydocker
结果:
REPOSITORY TAG IMAGE ID CREATED SIZE
test/mydocker new aa7224c55c6e 9 seconds ago 186MB