天天看点

从零开始安装和使用docker配置虚拟机安装和启动docker运行镜像Dockerfile 定制镜像

从零开始安装和使用docker

  • 配置虚拟机
  • 安装和启动docker
  • 运行镜像
  • Dockerfile 定制镜像

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,实现虚拟化。其特点与java的jvm类似,统一了服务的运行环境,使其不需要关心运行在什么设备之上。

由于其基于LXC的轻量级虚拟化的特点,docker最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS,自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。

配置虚拟机

既然是从零开始,那么我新安装了一台虚拟机,现在配置一下基本插件。

首先需要配置网络。

点击VMware虚拟机左上角的“编辑”,选择“虚拟网络编译器”,选中VMnet8(NAT模式),再点击右侧的“NAT设置”此时会看到如下界面

从零开始安装和使用docker配置虚拟机安装和启动docker运行镜像Dockerfile 定制镜像

vi /etc/sysconfig/network-scripts/ifcfg-ens33

在这个里面加入你的网络配置

BOOTPROTO=static  //修改
ONBOOT=yes   // 修改
# 以下添加:
IPADDR= 需要一个和网关一个网段并且不冲突的ip地址
NETMASK=255.255.255.0
GATEWAY=网关地址
DNS1=192.168.31.1 通过本地的ipcongi/all找
           

配置好之后试一下ping网络,如果可以ping通说明没问题了,我在配置的时候遇到了虚拟机可以访问外网和主机,但是主机访问不了虚拟机的情况,后来查看发现是因为虚拟机使用的VMnet8我的本地电脑配置的是动态获取ip,因此出现了问题,后来在

从零开始安装和使用docker配置虚拟机安装和启动docker运行镜像Dockerfile 定制镜像

这个位置吧ip改为静态ip就可以了。

还有一点需要注意的是虚拟机ip和主机ip最好不要在一个网段,不然据说会很卡。

安装和启动docker

安装docker的命令为:

yum install docker-ce
           

执行后报

[[email protected] ~]# yum install docker-ce
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.cn99.com
 * updates: mirrors.cn99.com
base                                                                          | 3.6 kB  00:00:00     
extras                                                                        | 2.9 kB  00:00:00     
updates                                                                       | 2.9 kB  00:00:00     
No package docker-ce available.

           

这是因为缺少安装一些相关依赖,需要安装一下依赖包。

执行:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
           

然后需要安装docer-ce的yum 源,执行:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
           

然后再执行 yum install docker-ce 都选择y就可以安装上了。

启动docker的命令:

sudo systemctl start docker
           

查看docker的状态:

docker info
           

可以看到

从零开始安装和使用docker配置虚拟机安装和启动docker运行镜像Dockerfile 定制镜像

将docker设置成为开机启动:

systemctl enable docker
           

还有一些与docker安装和卸载有关的常用命令:

systemctl restart docker //重启docker
docker --version //查看docker版本
sudo groupadd docker //创建docker用户组
docker run hellow-world //测试docker是否安装正常
sudo yum remove docker-ce //删除docker-ce
sudo rm -rf /var/lib/docker //删除docker镜像
docker ps -a //查看所有的docker容器
docker rm -f 容器id //删除对应容器
docker rmi 镜像名 //删除镜像
           

使用国内docker镜像加速器:

在: /etc/docker 下建立daemon.json文件,写入:

{
    "registry-mirrors":[
        "http://hub-mirror.c.163.com"
    ]
}
           

然后执行:

sudo systemctl daemon-reload
sudo systemctl restart docker
           

通过docker info 可以看到如下信息:

Registry Mirrors:

http://hub-mirror.c.163.com/

运行镜像

docker获取镜像的命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
           

具体参数可以通过 docker pull --help 查看

启动一个容器,并且进入容器中:

docker run -it --rm 容器镜像:版本 bash
           

列出镜像相关命令:

docker image ls //列出已经下载的镜像
docker system df //查看镜像,容器,数据卷所占用的空间
docker image ls -f dangling=true // 仓库名,标签均为<none>的镜像称为虚悬镜像(dangling image),查看此类镜像
docker image prune //删除虚悬镜像
docker image rm [选项]<镜像1>[<镜像2>...] //删除本地镜像
docker image rm $(docker image ls -q ubuntu) //删除所有仓库名为ubuntu的镜像
docker image rm $(docker image ls -q -f before=ubuntu:16.04) //删除所有在ubuntu:16.04 之前的镜像
docker run -d hello-world //后台运行hello-world
docker container stop 容器id //停止容器
docker container start 容器id //启动容器
docker container restart 容器id //重启容器
           

有镜像容器(实例)的时候,要先删除,然后再删除镜像。

docker exec -it 容器ID /bin/bash //进入容器
docker export 容器ID > aaa.zip //导出容器
cat aaa.zip | docker import -study/ubuntu:1.0 //导入镜像
docker container rm ubuntu:16.04 //删除终止状态的容器
docker container prune //清理所有处于终止状态的容器
           

Dockerfile 定制镜像

建立Dockerfile 的文本文件,

mkdir mynginx

cd mynginx

touch Dockerfile

写入:

FROM nginx
RUN echo '<h1>Hello,Docker!</h1>'> /usr/share/nginx/html/index.html
           

这里面FROM的意思是指定基础镜像,所有的镜像都需要指定基础镜像,并且需要在文件第一行声明。

docker里面有一个特殊的空白镜像通过

FROM scratch

使用,表示要不已任何镜像为基础创建空白镜像。

RUN用来执行命令行命令,分为两种格式:

shell格式:

RUN echo '<h1>Hello,Docker!</h1>'> /usr/share/nginx/html/index.html
           

exec格式:

RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install
           

构建镜像:

docker build -t nginx:v3
           

当然,dockerfile 包含了许多其他有用的命令:

COPY package.json /usr/src/app/
           

COPY命令将上下文中的文件复制到镜像中

需要解压缩的复制的时候使用ADD

CMD支持shell 和exec两种格式,用于指定默认容器主进程的启动命令。

ENTRYPOINT 也是运行命令,在使用ENTRYPOINT 的时候会改变CMD的使用含义,含义改为:将CMD的内容作为参数传给ENTRYPOINT 指令。

ENV 设置环境变量:

ENV = =

ARG 也是设置环境变量,和ENV不同的是这里是设置构建时期的环境变量,在运行时期已经不存在了,只能在历史记录中看到。

VOLUME 定义匿名卷

EXPOSE 声明端口

WORKDIR 指定工作目录

因为docker命令每一层都是在不同的容器中的,对应的位置也不一样,使用WORKDIR 可以使不同命令都基于指定的工作目录来运行

HEALTHCHECK 健康检查

可以判断容器主进程的服务状态是否正常,从而比较真实的反应容器实际状态。

HEALTHCHECK支持指定健康检查的时间间隔,健康检查的超时时间,连续健康检查失败的次数。超过这个次数会变成unhealthy。

ONBUILD 在它后面会跟上其他指令,这些指令中当前镜像构建的时候不会被执行,只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

docker save 可以保存镜像,然后移动镜像,docker load 可以将保存的镜像再次加载。

继续阅读