Docker系列(一)-MAC OS/CENTOS7系统下docker的安装及使用
一.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时,将容器暂停。