mac的docker安装

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 psdocker 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)

注意点:

  1.  删除前需要保证容器是停止的  stop
  2. 需要注意删除镜像和容器的命令不一样。 docker rmi ID  ,其中 容器(rm)  和 镜像(rmi)
  3. 顺序需要先删除容器

使之成为一个镜像:

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 试一试看能否成功

解决方案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的三步骤:

  1. 手动编写一个dockerFile文件,当然,必须要符合file的规范
  2. 有这个文件后,直接docker build 命令执行,获得一个自定义的镜像
  3. run

4.3、DockerFile文件构建的解析

DockerFile内容基础知识:

  1. 1、每条保留指令都必须为大写字母且后面要跟着至少一个参数
  2. 2、指令按照从上到下,顺序执行
  3. 3、表示注解
  4. 4、每条指令都会创建一个新的镜像层,并对镜像进行提交。

docker执行DockerFile的大致流程:

  1. 1、docker从基础镜像运行一个容器
  2. 2、执行一条指令并对容器作出修改
  3. 3、执行类似docker commit的操作提交一个新的镜像层
  4. 4、docker在基于刚提交的镜像运行一个新容器
  5. 5、执行dockerfile中的吓一跳指令之道所有指令都执行完成

总结:从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

  • DockerFile是软件的原材料
  • Docker镜像是软件的交付品
  • Docker容器则可以认为是软件的运行态。
  • DockerFile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石

  1. DockerFile,需要定义一个DockerFile、DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发型版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何涉及namespace的权限控制等等);
  2. Docker镜像,在用DockerFile定义一个文件之后,docker build时会产生一个Docker惊醒,当运行Docker镜像,当运行Docker镜像时,会真正开始提供服务;
  3. Docker容器,容器是直接提供服务的。

4.4、DockerFile体系结构(保留字指令)

  1. FROM :基础镜像,当前镜像是基于那个镜像的
  2. MAINTAINER(maintainer):镜像维护者的姓名和邮箱地址
  3. RUN:容器构建是需要运行的命令
  4. EXPOSE:当前容器对外暴露的端口
  5. WORKDIR:指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
  6. ENV:用来在构镜像过程中设置环境变量
  7. ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
  8. COPY:类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目录路径>位置 ;COPY src 
  9. VOLUME:容器数据卷,用于数据保存和数据持久化
  10. CMD:指定一个容器启动是要运行的命令;DockerFile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run之后的参数替换
  11. ENTRYPOINT(entrypoint):指定一个容器启动要运行的命令,entrypoint的目的和CMD一样,都是在指定容器启动程序及参数
  12. 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网站注册一个账号在按照上面的操作执行就可以了。

详细的可以参考:

https://blog.csdn.net/w275840140/article/details/80158972

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值