前言

           一般情况下,我们中直接使用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