docker安装包的官方地址:
https://docs.docker-cn.com/docker-for-mac/install/#install-and-run-docker-for-mac
这个地方是修改docker的镜像地址:
https://cr.console.aliyun.com/cn-hangzhou/mirrors
docker的文档:
https://github.com/guoshijiang/docker-virtual-technology/tree/master/chapterThree
安装完成后,
检查Docker Engine,Docker Compose和Docker Machine的版本
如果你的docker,docker-compose和docker-machine是能与Docker.app兼容的最新版本,那么你就可以运行下面这些
1deMacBook-Pro:etc a1$ docker --version
Docker version 17.03.1-ce-rc1, build 3476dbf
1deMacBook-Pro:etc a1$ docker-compose --version
docker-compose version 1.11.2, build dfed245
1deMacBook-Pro:etc a1$ docker-machine --version
docker-machine version 0.10.0, build 76ed2a6
1deMacBook-Pro:etc a1$ docker run hello-world
2.2. 浏览应用程序和运行一个案列
- 打开命令行终端,使用Docker命令检查Docker是不像所期望的那样正常工作。可以使用这些命令docker version, docker ps和docker run hello-world来确认Docker是否正常运行,如果这些命令能正常执行,那么就说Docker在运行着。
- 使用更刺激的方法,运行一个Docker化的web服务器,当然这样做的前提条件是你本地必须有你要运行的镜像。
docker run -d -p 80:80 --name webserver nginx
如果本地没有找到这个镜像,那么Docker将会去Docker Hub中拉取镜像。
注意:早期的Beta发布版本使用docker做为主机名来创建URL,现在端口号被暴露在虚拟机的私有IP地址并且在没有主机名字设置的情况下传递给主机,也可以看Beta9的发布注意点。
- 在你的web服务器正在运行的时候执行
docker ps
查看web服务器容器的详细信息。 - 停止或者移除容器和镜像
nginx web服务器在你停止或者移除容器之前会持续运行着,如果你想停止web服务器:docker stop webserver
,启动服务器用命令docker start webserver
。查看一个容器是否停止了用命令docker ps
;docker ps -a
查看终止状态的容器。使用docker rm -f webserver
命令来移除正在运行的容器。这个命令会移除容器,但不能移除nginx
镜像。你可以使用docker list命令来列出本地镜像。你可能会保存一些镜像在本地以致于你不用再次去Docker Hub中拉镜像。想要移除一个长期不需要的镜像,使用docker rmi后加ID号和镜像名字。例如,docker rmi ngix。 - 命令总结:
docker ps
查看正在运行的容器
docker stop
停止正在运行的容器
docker start
启动容器
docker ps -a
查看终止状态的容器
docker rm -f webserver
命令来移除正在运行的容器
docker images ls(docker image ls)可以列出所有镜像
docker rmi
删除的镜像
docker --version | docker version | docker info 显示docker的版本或者信息
docker run hello-world 运行docker镜像
docker image ls 列出docker镜像
docker container ls | docker container ls -all | docker container ls -a -q 列出docker容器(-all参数,-a -q参数)
docker container ls --all 列出容器(通过那个镜像产生的容器),如果镜像一直运行着,那么你不可以使用-- all
选项:
guosjdeMacBook:~ guo$ docker container ls --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c58dec734321 hello-world "/hello" 11 minutes ago Exited (0) 11 minutes ago hungry_nightingale
c3bcd1d52eb1 hello-world "/hello" 11 minutes ago Exited (0) 11 minutes ago quirky_clarke
3cb3f43adae6 hello-world "/hello" 11 minutes ago Exited (0) 11 minutes ago gifted_montalcini
d362e8fe6bdb kaixhin/theano "/bin/bash" 2 months ago Exited (255) 2 months ago cranky_snyder
3b77a144a920 registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow "/bin/bash" 2 months ago Exited (255) 2 months ago 6006/tcp, 8888/tcp dreamy_perlman
guosjdeMacBook:~ guo$
docker run --name 容器的名字 -d 镜像的名字
-d 表示的是detached,意味着执行完这句命令后控制台将不会被阻碍,可以继续输入命令操作。
2)获取正在运行的容器列表
docker ps
docker ps 当前运行的容器,
docker ps -l 显示最近创建的容器
docker ps -n:显示最近n个创建的容器
docker ps -q:静默模式,只显示容器编号
docker ps --no-trunc:不截断输出
docker ps -a:列出当前所有正在运行的容器+历史上运行过的
3)停止和启动容器
docker start/stop 容器名字/id
4)端口映射
需要将容器中运行的软件的端口映射到主机的端口,否则局域网内的主机是不能够访问的。
docker run [options] image [command] [arg...]
options说明(常用):有些是一个减号,有些是两个减号。
--name “容器新名字”:为容器指定一个名称;
-d:后台运行容器,并返回容器id,也即启动守护式容器;
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用;
-P:随机端口映射;
-p:指定端口映射,有一下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
docker run -it 9f38484d220f(镜像id)
docker run -it --name mycentos01p
docker run -d -p 6378:6379 --name myRedis redis
1、docker run -it -p 8888:8080 tomcat
2、docker run -it -P tomcat (不指定端口号,随机生成端口号) tomcat
3、docker run -it tomcat 没有向外暴露访问的端口
5)删除容器
docker rm id
docker rm -f $(docker ps -a -q):一次性删除多个容器
6)查看当前容器日志
docker logs name/id
7)登录容器
exec -it 容器名字bash
-i:保证我们的输入有效
-t:会分配一个伪终端
现在使用docker container stop来结束进程,使用CONTAINER ID,如下所示:
docker container stop 1fa4ab2cf395
想要删除镜像需要先删除容器:
1、docker ps -a 查询容器
2 、docker rm id(容器号id) 先删除容器
3、docker image ls 查询镜像ID
4、docker rmi id(镜像id)
注意点:
- 删除前需要保证容器是停止的 stop
- 需要注意删除镜像和容器的命令不一样。 docker rmi ID ,其中 容器(rm) 和 镜像(rmi)
- 顺序需要先删除容器
使之成为一个镜像:
docker commit 提交容器副本使之成为一个新的镜像
docker commit -a='wangbin' -m='wangbin' 容器id bin/tomcat:1.1
docker commit -a='作者' -m='提交的描述信息' 运行的容器id 要创建的目标镜像名:标签名
docker logs
docker logs -f -t --tail 容器id
-t是加入时间戳
-f跟随最新的日志打印
-tail数字显示最后多少条
docker run -d centos /bin/sh -c "while true;do echo hello wang;sleep 2;done"
查看容器内的进程:docker top 容器号
查看容器内部细节:docker inspect 容器号
exit | ctr+p+q
进入到没有停止到容器:
docker attach 容器号
docker exec -t 容器号 ls -l /tmp
1.docker login的问题
Username: yanshinian
Password:
Error saving credentials: error storing credentials - err: exit status 1, out: `The user name or passphrase you entered is not correct.`
参考链接:https://github.com/docker/docker-credential-helpers/issues/65
解决办法:rm /usr/local/bin/docker-credential-osxkeychain
2、docker push 镜像 An image does not exist locally with the tag
解决方案1:
build的时候这样:
docker build -t gbruin/bruin-nginx:test .
然后用:
docker push gbruin/bruin-nginx:test
docker 容器数据卷
先来看看docker的理念:
1、将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的
2、容器之间希望有可能共享数据
docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。
一、数据的持久化
卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过union file system 提供一些用于持续或共享数据的特性:
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除起挂载的数据卷
特点:
1、数据卷可在容器之间共享或重用数据
2、卷中的更改可以直接生效
3、数据卷中更改不会包含在镜像的跟新中
4、数据卷的生命周期一直持续到没有容器使用它为止
二、容器间继承+共享数据
查看容器的详细的信息
docker inspect e7b63e23132b(容器号)
3、数据卷挂载:
数据卷:容器内添加:
1⃣️、直接命令添加
Docker目录挂载:
1、docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it -v /Users/a1/Download/mydata:/containdata centos
在使用这个命令:docker inspect e7b63e23132b(容器号)
容器停止退出后,主机修改后数据是否同步:同步
命令(带权限):docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名 (ro:readonly)
docker run -it -v /Users/a1/Download/mydata:/containdata:ro centos
2⃣️、dockerfile添加
dockerFile是什么?
javaEE hello.java ---> hello.class docker images ----->dockerFile
2.1、可在dockerFile中使用VOLUME指令来给镜像添加一个或多个数据卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","dataVolumeContainer3"]
说明:由于可移植和分享的考虑,用-v主机目录:容器目录这种方式不能够直接在dockerFile中实现。
由于宿主机目录是依赖于特定主机的,并不能够保证在所有的宿主机上都能存在这样的特定目录。
2.2、File的构建
#volume test
FROM centos
VOLUME["/dataVolumeContainer2","dataVolumeContainer3"]
CMD echo "finished,-------success"
CMD /bin/bash
2.3、构建
命令:docker build -f /Users/a1/Download/DockerFile -t bin/centos .
2.4、数据卷容器:
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
总体介绍:以上一步新建的镜像bin/centos为模版并运行容器dockerContainer1/dockerContainer2
- 1、启动容器名为dockerContainer1:docker run -it --name dockerContainer1 bin/centos
- 2、启动容器名为dockerContainer2(dockerContainer2继承dockerContainer1):
- docker run -it --name dockerContainer2 --volumes-from dockerContainer1 bin/centos
- 3、数据卷是否共享?:在dockerContainer1添加的内容,可以在dockerContainer2里面可以看到,在dockerContainer2添加的文件,dockerContainer1一样能看到,实现了共享。
- 4、总结:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
4、DockerFile文件
4.1、dockerFile是什么?
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
4.2、编写dockerFile的三步骤:
- 手动编写一个dockerFile文件,当然,必须要符合file的规范
- 有这个文件后,直接docker build 命令执行,获得一个自定义的镜像
- run
4.3、DockerFile文件构建的解析
DockerFile内容基础知识:
- 1、每条保留指令都必须为大写字母且后面要跟着至少一个参数
- 2、指令按照从上到下,顺序执行
- 3、表示注解
- 4、每条指令都会创建一个新的镜像层,并对镜像进行提交。
docker执行DockerFile的大致流程:
- 1、docker从基础镜像运行一个容器
- 2、执行一条指令并对容器作出修改
- 3、执行类似docker commit的操作提交一个新的镜像层
- 4、docker在基于刚提交的镜像运行一个新容器
- 5、执行dockerfile中的吓一跳指令之道所有指令都执行完成
总结:从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,
- DockerFile是软件的原材料
- Docker镜像是软件的交付品
- Docker容器则可以认为是软件的运行态。
- DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石
- DockerFile,需要定义一个DockerFile、DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发型版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何涉及namespace的权限控制等等);
- Docker镜像,在用DockerFile定义一个文件之后,docker build时会产生一个Docker惊醒,当运行Docker镜像,当运行Docker镜像时,会真正开始提供服务;
- Docker容器,容器是直接提供服务的。
4.4、DockerFile体系结构(保留字指令)
- FROM :基础镜像,当前镜像是基于那个镜像的
- MAINTAINER(maintainer):镜像维护者的姓名和邮箱地址
- RUN:容器构建是需要运行的命令
- EXPOSE:当前容器对外暴露的端口
- WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
- ENV:用来在构镜像过程中设置环境变量
- ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
- COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目录路径>位置 ;COPY src
- VOLUME:容器数据卷,用于数据保存和数据持久化
- CMD:指定一个容器启动是要运行的命令;DockerFile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run之后的参数替换
- ENTRYPOINT(entrypoint):指定一个容器启动要运行的命令,entrypoint的目的和CMD一样,都是在指定容器启动程序及参数
- ONBUILD(onbuild):当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。
entrypoint与CMD的区别:
1、CMD只有最后一个生效,而entrypoint是追加,都有效
entrypoint:docker run之后的参数会被当作参数传递给entrypoint,之后形成新的命令组合
例如:
1.1创建DockerFile文件
例子1:
FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://www.baidu.com"]
例子2:
FROM centos
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://www.baidu.com"]
1.2构建
docker build -f /Users/a1/Download/DockerFileBaidu -t baidu .
docker build -f /Users/a1/Download/DockerFileEntrypoint -t entrypoint .
1.3运行结果对比
小贴:curl命令解释
- curl命令解释:curl命令可以用来执行下载,发送各种HTTP请求,指定HTTP头部等操作。
- 如果系统没有curl可以使用yum install curl 安装,也可以下载安装。
- curl是将下载文件输出到stdout
- 使用命令:curl http://www.baidu.com执行http://www.baidu.com的html就会显示在屏幕上了
- 这是最简单的使用方式。用这个命令获得了http://curl.haxx.se只想的页面,同样,如果这里的将只是显示文件头部,即html文档的header。要全部显示,请加参数-i.
ONBUILD:
例子:
例子1:
第一步创建dockerfile文件
FROM centos
RUN yum install -y curl
CMD ["curl","-s","http://www.baidu.com"]
ONBUILD RUN echo "father is onbuild -----"
第二步构建
docker build -f /Users/a1/Download/DockerFileEntrypoint -t myfather .
例子2:
第一步创建dockerfile文件
FROM myfather
RUN yum install -y curl
ENTRYPOINT ["curl","-s","http://www.baidu.com"]
第二步构建
docker build -f /Users/a1/Download/son -t son .
5、自己定义一个tomcat
5.1、编写的dockerfile
ROM centos
#这个就是作者和邮箱
MAINTAINER tomcat<2259924383qq.com>
#copy是拷贝文件,只是拷贝不能解压缩,这就是和add最大的区别
COPY text.text /usr/local/copy,text
#把文件拷贝到usr/local底下并且解压,把java和tomcat加到容器
ADD jdk-8u211-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.19.tar.gz /usr/local/
#安装vim编译器
RUN yum install -y vim
#配置环境变量
ENV MYPATH /usr/local
#进入容器到的目录,设置工作访问时候的workdir路径,登陆落脚点
WORKDIR $MYPATH
#配置java和tomcat的环境变量
ENV JAVAHOME /usr/local/jdk1.8.0_211
ENV TOMCATHOME /usr/local/apache-tomcat-9.0.19
ENV TOMCATHOME_BASE /usr/local/apache-tomcat-9.0.19
ENV CLASSPATH $JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jar
ENV PATH $PATH:$JAVAHOME/bin:$TOMCATHOME/lib:$TOMCATHOME/bin
#容器运行时暴露的端口号
EXPOSE 8080
#启动运行tomcat
#ENTRYPOINT ["/usr/local/apache-tomcat-9.0.19/bin/startup.sh"]
#CMD ["/usr/local/apache-tomcat-9.0.19/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.19/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.19/bin/logs/catalina.out
5.2、构建
docker build -f DockerFile -t mytomcat9 .
5.3、启动(把日志同步到宿主机上)(这个命令一定不能打错了,不然一定起不来) 部署自己的项目在test下面
docker run -d -p 8888:8080 --name mytomcat -v /Users/a1/Download/tomcat9/test:/usr/local/apache-tomcat-9.0.19/webapps/test
-v /Users/a1/Download/tomcat9/tomcat9Logs:/usr/local/apache-tomcat-9.0.19/webapp/logs --privileged=true mytomcat9
总结:
6、本地镜像发布到阿里云
在这个https://cr.console.aliyun.com/cn-hangzhou/instances/repositories网站注册一个账号在按照上面的操作执行就可以了。
详细的可以参考: