Docker系列(一)-MAC OS/CENTOS7系统下docker的安装及使用

By prince No comments

一.docker安装

mac系统下安装docker

brew cask install docker

centos7系统下安装docker

wget -P /etc/yum.repos.d/ https://download.docker.com/linux/centos/docker-ce.repo 
yum install -y docker-ce

mac系统下启动docker

brew services start docker-machine

centos7系统下启动docker/设置开机启动

systemctl start docker
systemctl enable docker

docker版本及信息:

docker version
docker info

二.Dockerfile命令

使用Dockerfile去构建镜像好比堆积木、使用pom去构建maven项目一样,有异曲同工之妙,下面就把Dockerfile中主要的命令介绍一下。

组成部分

部分 命令
基础镜像信息 FROM
维护者信息 MAINTAINER
镜像操作指令 RUN、COPY、ADD、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令 CMD、ENTRYPOINT

1、创建一个Dockerfile

Dockerfile命名必须为“Dockerfile”,Docker镜像构建时,会查找指定目录中的Dockerfile。

vi Dockerfile

2、编写Dockerfile

例子

FROM centos

MAINTAINER example <[email protected]>

WORKDIR /apps/tomcats

ADD jdk-8u202-linux-x64.tar.gz /apps/java
ADD apache-tomcat-7.0.96.tar.gz /apps/tomcats
RUN yum -y install vim net-tools && mv apache-tomcat-7.0.96 tomcat-8080
#ADD ROOT.war /apps/tomcats/tomcat-8080/webapps

VOLUME /apps/tomcats/tomcat-8080/logs

ENV JAVA_HOME=/apps/java/jdk1.8.0_202
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /apps/tomcats/tomcat-8080
ENV CATALINA_BASE /apps/tomcats/tomcat-8080
ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080
ENTRYPOINT /apps/tomcats/tomcat-8080/bin/startup.sh && tail -f /apps/tomcats/tomcat-8080/logs/catalina.out

 

(1)环境配置(FROM)

FROM centos

通过FROM指令,Docker编译程序能够知道通过哪个基础镜像执行来进行编译。所有的Dockerfile都必须以FROM指令开始。通过该指令,我们相当于有了一个最基本的centos系统。

(2)作者配置(MAINTAINER)

MAINTAINER指令允许你设置生成这个镜像的作者和其电子邮件,如:

MAINTAINER example <example@example.com>

(3)指定工作目录(WORKDIR)

使用 WORKDIR /apps/tomcats 可以将工作目录定位到/apps /tomcats目录下

在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录。如

WORKDIR /apps/tomcats
WORKDIR logs
RUN echo 'test workdir' > text.txt

最终会在/apps/tomcats/logs目录下生成text.txt文件

(4)拷贝文件(COPY)

将主机的文件复制到镜像内,如果目的位置不存在,Docker会自动创建所有需要的目录结构,但是它只是单纯的复制,并不会去做文件提取和解压工作。如:

COPY test.txt /apps/tomcats

上面的命令会将与Dockerfile同级目录的test.txt文件上传到docker容器中的/apps/tomcats/目录下

注意:需要复制的目录一定要放在Dockerfile文件的同级目录下
因为构建环境将会上传到Docker守护进程,而复制是在Docker守护进程中进行的。任何位于构建环境之外的东西都是不可用的。COPY指令的目的的位置则必须是容器内部的一个绝对路径。

(5)添加文件(ADD)

将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样,如:

ADD jdk-8u202-linux-x64.tar.gz /apps/java
ADD apache-tomcat-7.0.96.tar.gz /apps/tomcats

但是ADD会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作。这里jdk-8u202-linux-x64.tar.gz会解压到 /apps/java目录,apache-tomcat-7.0.96.tar.gz解压到/apps/tomcats目录。

(6)解压并重命名目录(RUN)

RUN yum -y install vim net-tools && mv apache-tomcat-7.0.96 tomcat-8080

RUN 指令用来在Docker的编译环境中运行指定命令。这里会安装vim和net-tools并且重命名目录apache-tomcat-7.0.96为tomcat-8080。

也可以使用exec格式RUN ["executable", "param1", "param2"]的命令,如:

RUN ["yum","install","-y","vim"]

(7)环境变量(ENV)

ENV指令用来在镜像构建过程中设置环境变量,后续的RUN可以使用它所创建的环境变量,当创建基于该镜像的container的时候,会自动拥有设置的环境变量.

ENV JAVA_HOME=/apps/java/jdk1.8.0_202
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /apps/tomcats/tomcat-8080
ENV CATALINA_BASE /apps/tomcats/tomcat-8080
ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

(8)指定端口(EXPOSE)

暴露镜像的端口供主机做映射,启动镜像时,使用-P参数来讲镜像端口与宿主机的随机端口做映射。使用方式(可指定多个):

EXPOSE 8080
EXPOSE 8081

(9)执行命令(ENTRYPOINT,CMD)

至此,我们要做的准备工作就做完了。使用下面这条命令,运行我们在第6步创建的脚本,一个简单的Tomcat的Dockerfile就编写完成了。

ENTRYPOINT /apps/tomcats/tomcat-8080/bin/startup.sh

ENTRYPOINT 用于标明一个镜像作为容器运行时,最后要执行的程序或命令。

也可以用CMD

CMD /apps/tomcats/tomcat-8080/bin/startup.sh

同样可以使用exec语法,如

CMD ["/apps/tomcats/tomcat-8080/bin/startup.sh"]
CMD的命令会被 docker run 的命令覆盖而ENTRYPOINT不会

下面举个例子

ENTRYPOINT ["/apps/nginx/sbin/nginx"]

然后通过启动build之后的容器

docker run -ti image -g "daemon off"

此时-g “daemon off”会被当成参数传递给ENTRYPOINT,最终的命令变成了

/apps/nginx/sbin/nginx -g "daemon off"
CMD和ENTRYPOINT都存在时

CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖,如:

...
ENTRYPOINT ["curl", "-s"]
CMD ["httpbin.org/uuid"]

之后启动构建之后的容器

  • 使用docker run -ti image输出
    {
    
    "uuid": "a5ce876c-9ab6-4ebd-9555-1a85fd992a78"
    
    }
  • 使用docker run -ti image cip.cc输出
    IP : x.x.x.x
    地址 : 中国 北京 北京
    运营商 : 电信
    URL : http://www.cip.cc/x.x.x.x

备注:httpbin.org/uuid是获取一个唯一uuid的网站,cip.cc是获取当前ip的网站

(10)指定当前用户(USER)

指定该镜像以什么样的用户去执行,如:

RUN groupadd -r redis && useradd -r -g redis redis
USER redis
RUN [ "redis-server" ]

(11)容器数据卷(VOLUME)

容器数据卷,用于数据保存和持久化工作

VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>

VOLUME [“<路径1>”, “<路径2>”…]:

用来向基于镜像创建的容器添加卷。比如你可以将nginx镜像中存储数据的log文件目录指定为宿主机的某个文件目录。(容器内部建议不要存储任何数据)
如:

VOLUME /app/nginx/logs/ /var/logs/nginx

注意:VOLUME 主机目录 容器目录

VOLUME <路径>:

为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

VOLUME /apps/tomcats/tomcat-8080/logs

这里的 /apps/tomcats/tomcat-8080/logs 目录就会在运行时自动挂载为匿名卷,任何向 /apps/tomcats/tomcat-8080/logs 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。比如:

docker run -d -v $PWD/logs:/apps/tomcats/tomcat-8080/logs

在这行命令中,就使用了 当前目录下的logs 这个命名卷挂载到了 /apps/tomcats/tomcat-8080/logs这个位置,替代了 Dockerfile 中定义的匿名卷的挂载配置。

3.构建镜像

进入Dockerfile所在目录,运行命令 docker build -t mytomcat . (注意最后有个点用来表示当前目录,初次构建速度会比较慢,需要多等一会。)

4.运行Docker容器

docker run -dti -p 8080:8080 -v $PWD/logs:/apps/tomcats/tomcat-8080/logs mytomcat

三.docker镜像

mac系统下配置docker私服和镜像加速

修改配置文件

vi ~/.docker/daemon.json

在文件中添加如下的内容,告诉客户端私有镜像仓库是一个安全的仓库:

insecure-registries是安全私有仓库

registry-mirrors配置的是docker加速镜像

{
"insecure-registries": ["docker.example.com"]
"registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://reg-mirror.qiniu.com"
]
}

重启docker

brew services start docker-machine

centos7系统下配置docker私服和镜像加速

修改配置文件

vi /etc/docker/daemon.json

{  
   "insecure-registries": ["docker.example.com"]
   "registry-mirrors": [
   "https://dockerhub.azk8s.cn", 
   "https://reg-mirror.qiniu.com" 
   ]
}

重启docker

systemctl daemon-reload
systemctl restart docker

登录私有仓库

使用用户名密码登陆私有仓库

docker login <nexus-hostname>:<repository-port>
如:
docker login -u admin -p admin docker.example.com

拉取镜像

docker pull <nexus-hostname>:<repository-port>/<image>:<tag>
如
私有仓库
docker pull docker.example.com/nginx:latest

官方仓库
docker pull nginx:latest (docker pull docker.io/nginx:latest)

给镜像打标签

docker tag <imageId or imageName> <nexus-hostname>:<repository-port>/<image>:<tag> 
如
私有仓库
docker tag nginx:latest docker.example.com/nginx:0.1

官方仓库
docker tag nginx:latest username/nginx:0.1

将本地镜像上传到私有仓库

docker push <nexus-hostname>:<repository-port>/<image>:<tag>
如
私有仓库
docker push docker.example.com/nginx:0.1

官方仓库
docker push username/nginx:0.1 (docker tag image username/repository:tag)

搜索镜像

docker search <nexus-hostname>:<repository-port>/<image>
如
私有仓库
docker search docker.example.com/nginx

官方仓库
docker search nginx

列出本地镜像

docker images options <nexus-hostname>:<repository-port>/<image>:<tag>
如
docker images runoob/ubuntu:v3   
docker images      (查询所有)
docker image ls -a (查询所有)

删除镜像

docker rmi <imageId or imageName>
docker image rm <imageId or imageName>
如
docker rmi nginx

docker image rm nginx 

docker rmi -f nginx  (强制删除)

四.docker容器

列出容器

docker ps
docker ps -a

新建容器

docker create -it nginx:latest

启动容器

docker start <CONTAINER_ID or CONTAINER_NAME>
如
docker start nginx

新建并启动容器

docker run centos ls /

–rm : 退出容器的时候容器就被删除,如下

docker run --rm centos ls /

-ti:   可以启动一个bash终端,允许用户交互:
-t参数:让docker分配一个伪终端绑定到标准输出
-i参数:让伪终端的标准输入保持开启状态,接收用户输入,实现交互

docker run -it centos /bin/bash

-d:  很多时候我们需要让容器在后台以守护态(Daemonized)形式运行。此时可以通过-d参数来实现。

docker run -d centos

-p:  -P大写:Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
-p小写:可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。

docker run -d -p 8080:80 nginx:apline

-v: 在容器上映射目录到宿主机目录

docker run -it -v /soft:/soft centos /bin/bash

–memory :设置容器内存限制

–cpu-shares:设置CPU 利用率权重

docker run --memory 100m --cpu-shares 10 centos

数据卷容器

如果你有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。

数据卷容器,其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

首先,创建一个命名的数据卷容器 dbdata:

docker run -d -v /dbdata --name dbdata training/postgres echo Data-only container for postgres

然后,在其他容器中使用 --volumes-from 来挂载 dbdata 容器中的数据卷。

docker run -d --volumes-from dbdata --name db1 training/postgres

docker run -d --volumes-from dbdata --name db2 training/postgres
还可以使用多个 --volumes-from 参数来从多个容器挂载多个数据卷。 也可以从其他已经挂载了数据卷的容器来挂载数据卷。
docker run -d --name db3 --volumes-from db1 training/postgres

*注意:使用 --volumes-from 参数所挂载数据卷的容器自己并不需要保持在运行状态。

如果删除了挂载的容器(包括 dbdata、db1 和 db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。 这可以让用户在容器之间升级和移动数据卷。

拷贝文件

容器拷贝到宿主机
docker cp CONTAINER_ID:SRC_PATH DEST_PATH
如
docker cp 96f7f14e99ab:/www /tmp/

宿主机拷贝到容器
docker cp SRC_PATH  CONTAINER_ID:DEST_PATH
如
docker cp /www/runoob 96f7f14e99ab:/www

在运行的容器中执行命令

进入容器终端并且的保留为容器终端的输入形式(-it和bash的结合作用)

docker exec -it  CONTAINER_ID  bash 
如
docker exec -it  bf08b7f2cd89  bash

docker attach可以attach到一个已经在运行的容器的stdin,然后进行命令执行的动作。

但是需要注意的是,如果直接从这个stdin中exit(ctrl+d),会导致容器的停止。非常不建议使用此命令操作容器。

如果不小心退出了,再次启动容器,进入容器启动服务即可。

正确的退出姿势 –> 组合键:Ctrl+P+Q

docker attach  <CONTAINER_ID or CONTAINER_NAME>  bash
如
docker attach  bf08b7f2cd89  bash

查看容器进程

docker top <CONTAINER_ID or CONTAINER_NAME>
如
docker top bf08b7f2cd89

查看容器使用资源情况

docker stats (不带任何参数选项)
docker stats --no-stream  (只返回当前的状态)
docker stats --no-stream   容器ID/Name (只输出指定的容器)
docker stats --format "table{{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" (格式化输出的结果)

查看容器内部的日志

docker logs -f <CONTAINER_ID or CONTAINER_NAME>
如
docker logs -f bf08b7f2cd89

检查容器

docker inspect <CONTAINER_ID or CONTAINER_NAME>
如
docker inspect bf08b7f2cd89

关闭容器

docker stop <CONTAINER_ID or CONTAINER_NAME>
如
docker stop nginx

删除容器

docker rm <CONTAINER_ID or CONTAINER_NAME>
如
docker rm nginx 
docker rm -f nginx (强制删除)

创建实名数据卷

docker volume create --name [volume name]
如
docker volume create my-vol

创建匿名数据卷

docker volume create

查看数据卷列表

docker volume ls

查看具体数据卷

docker volume inspect [volume name]
如
docker volume inspect my-vol

删除数据卷

docker volume rm [volume name]
如
docker volume rm my-vol

创建自定义网桥

docker network create

连接容器到用户自定义网桥

docker network connect

查询全部网桥

docker network ls

删除网桥

docker network rm

断开容器到用户自定义网络的连接

docker network disconnect

查询网桥详情

docker network inspect

根据容器创建新镜像

docker commit [OPTIONS] CONTAINER_ID [REPOSITORY[:TAG]]
如
docker commit -a "example" -m "nginx 测试" a404c6c174a2 mynginx:v1 

OPTIONS说明:

  • -a :提交的镜像作者;
  • -c :使用Dockerfile指令来创建镜像;
  • -m :提交时的说明文字;
  • -p :在commit时,将容器暂停。

发表评论

 

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据