Docker 概念、命令、DockerFile等看这篇就够了

1.docker的感念,docker是什么

docker 分为三种感念:镜像 容器 仓库
镜像:类似于一个模板,里面包含了一些内容
容器:容器是一个镜像的实例,如果理解镜像为一个 class,那么容器就被理解为是 new class(); 是镜像的实例
仓库:就是下载镜像资源的地方。
docker 容器不是虚拟机,容器可以说是一个进程,我们可以给容器分配内存。就像windows安装了虚拟机,可以给虚拟机分配内存大小,磁盘空间。

2.docker基础命令

搜索镜像,从maven仓库中查询

docker search mysql

列出当前系统存在的镜像

docker images

给镜像更换名称

docker tag imageId repository:tag

删除镜像(-f 强制) 必须知道镜像的 imageId

docker rmi -f imageId

repository:tag(镜像的仓库源:镜像的标签) 拉取

docker pull repository:tag

运行一个容器

docker run -it  -d --name "xxx" -p port1:port2 -p port3:port4 repository:tag -v home/data:/data
        docker run -> 运行一个容器
        -i -> 交互
        -t -> 终端,-it 会运行 jar 或其他应用的时候 查看他们的启动信息
        -d -> 后台运行
        -p -> 端口映射 port1(代表物理机) port2(代表容器) 容器的端口是可以重复的,所以容器和物理机的端口可以一致。rabbitmq有两个端口5672和15672 所以会用到双 -p
        repository:tag -> 如果不指定tag,默认使用最新的
        启动成功之后,会有一个运行的容器id
        --name "xxx" -> 指定容器名称
        -v /home/data:/data -> /home/data(宿主机):/data(容器) 本地地址和容器地址产生挂载关系, 在容器内部该目录下,或者宿主机内部该目录下,修改文件、创建文件,彼此都会同步修改

查看运行的容器

docker ps 

查看所有状态的容器

docker ps -a

检查容器内部信息

docker inspect 容器名称|容器前12位id

停止容器

docker stop 容器名称|容器前12位id

开启容器运行

docker start 容器名称

删除容器之前必须先停止容器运行

docker rm 容器名称

查看容器日志

dokcer logs -f 容器id

进入容器内部

docker exec -it mysql bash # 进入mysql内部
mysql -uroot -p123456 # 登录mysql服务 注意这里mysql -uroot -p123456 是连起来的

把一个容器制作为一个新的镜像

docker commit 
 -m="提交信息" 
 -a="作者" 
 容器id
 自定义镜像名称:[自定义标签名]

查看容器的信息

docker inspect 容器ID

对于没有私有仓库的要使服务器间共享一个docker镜像,可以先把某台机器上的进行先导出,然后其他服务器在导入即可

# 导出
docker save 
 镜像ID
 -o /本地路径/文件.tar  这句话意思导出到你宿主机的一个地址,文件名随便起后缀为tar,路径要提前建好

# 导入
docker load < /上传文件的地址/导出的文件名.tar

# 查看导入的镜像
docker images

容器之间共享,容器2 共用 容器1

docker tun -it 
  -- name 容器2
  --volumes-from 容器1(容器1必须已启动)
  镜像名称

查看制作镜像时叠加其他镜像的操作

docker history 镜像ID

3.修改已经存在容器的端口

1、停止容器(docker stop d00254ce3af7)
2、停止docker服务(systemctl stop docker)
3、修改这个容器的hostconfig.json文件中的端口(原帖有人提到,如果config.v2.json里面也记录了端口,也要修改)

cd /var/lib/docker/containers/d00254ce3af7*     #这里是CONTAINER ID

vim hostconfig.json
如果之前没有端口映射, 应该有这样的一段:
"PortBindings":{}

增加一个映射, 这样写:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"60000"}]}
前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口

4、启动docker服务(systemctl start docker)
5、启动容器(docker start d00254ce3af7)

4.制作镜像的基本命令

概念

Dockerfile 默认会把当前所在文件的上下问都发送给 Docker Server,最终制作成一个镜像,比如你得 DockerFile 在 linux的根(/)目录,那么就会递归根目录下的所有文件,发送到 Docker Server 制作镜像,所以制作 Dockerfile 最好是在某一个地方新建文件夹去制作。制作过程都是依赖于一个个的镜像,所以会有缓存加速下次制作,如果不需要依赖缓存 可以在命令制作的最后面加 --no-cache

.dockerIgnore 是用来忽略哪些文件或目录不参与到制作镜像中

制作命令:docker build -f /home/docker/nginx/Dockerfile . -f 用来指定 Dockerfile 所在的位置,一般会使用 docker build -t nginx2 . -t 在当前目录制作镜像,nginx2 镜像的名字,. 代表 Dockerfile 就在当前目录

命令
指令 描述
FROM 构建的新镜像是基于哪个镜像。例如:FROM centos:6,第一个指令必须是FROM
MAINTAINER 镜像维护者姓名或邮箱地址。例如:MAINTAINER Mr.chen
RUN 构建镜像时运行的Shell命令。例如:RUN ["yum","install","httpd"] 也可以直接 RUN yum install httpd
或者RUN yum install httpd
CMD 容器运行时执行的Shell命令(编写的dockerfile中多个cmd都会执行,但默认保留最后一个命令,如果 docker run 运行时传递command,会覆盖cmd的保留命令),启动容器会执行CMD的保留命令。例如:CMD ["-c","/start.sh"] 也可以是 CMD echo 'hello docker'
或者CMD ["/usr/sbin/sshd","-D"]或者CMD /usr/sbin/sshd -D
EXPOSE 声明容器运行的服务端口。例如:EXPOSE 80 443,但是默认都是 tcp 协议,如果想要暴漏udp 协议,则是 EXPOSE 80/udp ,注意只能是tcp或udp
ENV 设置容器内的环境变量。例如:ENV MYSQL_ROOT_PASSWORD 123456
ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
例如:ADD ["src","dest"]或者ADD https://xxx.com/html.tar.gz /var/www/html
或者:ADD html.tar.gz /var/www/html
COPY 拷贝文件或目录到镜像(不能自动解压缩)。例如:COPY ./start.sh /start.sh
ENTRYPOINT 运行容器时执行的Shell命令(不能被运行时传递的参数覆盖),比CMD牛皮一些。例如:ENTRYPOINT ["/bin/bash","-c","/start.sh"]
或者ENTRYPOINT /bin/bash -c "/start.sh"
VOLUME 指定容器挂载点到宿主机自动生成的目录或其他容器
例如:VOLUME ["/var/lib/mysql"]
USER 为RUN,CMD和ENTRYPOINT执行命令指定运行用户
例如:USER Mr_chen
WORKDIR 指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
例如:WORKDIR /data
HEALTHCHECK 健康检查。例如:HEALTHCHECK --interval=5m --timeout=3s --retries=3
CMD curl -f http://localhost/ exit 1
ARG 在构建镜像时指定一些参数。例如:ARG user
ONBUILD 当镜像被继承后触发在 ONBUILD 里写的命令,继承者直接使用 FROM 命令继承当前镜像的名称即可,在 build 的时候触发

简单镜像制作

编写 dockerfile

#volume test
# FROM 下载
FROM centos
# 在根目录下新建两个目录,该文件会默挂载到宿主机的某个目录下,对此的创建文件删除等都会同步,
# 可以通过 docker inspect 容器ID 来查看对应的文件地址
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
# 输出一句成功
CMD echo "finished,-------------success1"
CMD /bin/bash

编译

docker build
 -f dockerfile的文件路径 
 -t 命名空间/镜像名称(如:test/centos),整体也可以理解为镜像名称
 . 点代表当前目录

运行

docker run -it 镜像名称

如果出现 cannot open directory .: Permission denied 在运行的时候 --Privileged=true
docker run -it 镜像名称 --Privileged=true

docker 构建nginx镜像

#首先开启ipv4转发
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf 
sysctl -p
net.ipv4.ip_forward = 1

#创建nginx的镜像目录
mkdir -p dockerfile/lib/centos/nginx
cd dockerfile/lib/centos/nginx

#准备Dockerfile文件
vim Dockerfile
FROM centos:7       #构建的新镜像是基于哪个镜像(构建的nginx是基于centos7构建的,依赖centos7的系统支持,如果没有镜像自动下载)
MAINTAINER wk       #镜像制作人     
RUN yum install -y gcc gcc-c++ make openssl-devel pcre-devel      #构建镜像时运行shell命令,yum安装nginx的依赖包
ADD nginx-1.12.1.tar.gz /tmp          #拷贝文件或目录到镜像下,遇到压缩文件自动解压缩
RUN cd /tmp/nginx-1.12.1 && \         #运行shell命令编译安装nginx,make -j 给与2个线程编译 
    ./configure --prefix=/usr/local/nginx && \
    make -j 2 && \
    make install
RUN rm -rf /tmp/nginx-1.12.1* && yum clean all      #删除nginx源码包和清空yum缓存,使容器最轻量化
COPY nginx.conf /usr/local/nginx/conf                   #拷贝文件或目录到镜像 
WORKDIR /usr/local/nginx                   #为RUN,CMD,ENTRYPOINT,COPY和ADD设置工作目录(指定进入容器中默认被切换的目录)。
EXPOSE 80                            #声明容器的端口号
CMD ["./sbin/nginx", "-g", "daemon off;"]         #运行容器时执行的shell命令 -g daemon off 不以守护进程的方式开启nginx,即不以后台运行的方式开启nginx

#将事先准备好的nginx-1.12.1.tar.gz和nginx.conf配置文件拷贝到当前目录下
ls
Dockerfile  nginx-1.12.1.tar.gz  nginx.conf

#build基于nginx的docker镜像
docker build -t nginx:1 .

docker 构建java环境

#创建java镜像构建存储目录
mkdir -p dockerfile/lib/centos/tomcat
cd dockerfile/lib/centos/tomcat

#将所需软件包拷贝到当前目录下
ls
apache-tomcat-8.0.46.tar.gz  Dockerfile  jdk-8u45-linux-x64.tar.gz  server.xml

#筹备Dockerfile
vim Dockerfile
FROM centos:7           
MAINTAINER wk

ADD jdk-8u45-linux-x64.tar.gz /usr/local        #创建javaJDK环境
ENV JAVA_HOME /usr/local/jdk1.8.0_45       #强行生成一个环境变量

ADD apache-tomcat-8.0.46.tar.gz /usr/local    #解压tomcat
COPY server.xml /usr/local/apache-tomcat-8.0.46/conf   #复制配置文件

RUN rm -f /usr/local/*.tar.gz            #删除安装包 容器轻量化

WORKDIR /usr/local/apache-tomcat-8.0.46      #工作目录  进入容器所在的目录
EXPOSE 8080                       #映射端口
ENTRYPOINT ["./bin/catalina.sh", "run"]      #用catalina。sh run前台启动tomcat

#build基于tomcat的镜像
docker build -t tomcat:1 .

#创建网页挂载目录
mkdir -p /app

#启动tomcat的容器进程
docker run -dit --name=tomcat -p 8080:8080 --network lnmp --mount type=bind,src=/app/,dst=/usr/local/apache-tomcat-8.0.46/webapps tomcat:1

docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
15eca19688ca        tomcat:1            "./bin/catalina.sh r…"   17 seconds ago      Up 16 seconds       0.0.0.0:8080->8080/tcp   tomcat
7ce4d14cf756        nginx:1             "./sbin/nginx -g 'da…"   2 hours ago         Up About an hour    0.0.0.0:8888->80/tcp     lnmp-nginx
5b49fc160f9e        php:1               "./sbin/php-fpm -c /…"   2 hours ago         Up About an hour    9000/tcp                 lnmp_php

#创建网站测试页
mkdir /app/ROOT
vim /app/ROOT/index.html 
ddddddddddddddddddd

Docker 使用阿里云仓库或自建仓库

阿里云仓库

  1. 先登录阿里云镜像服务,地址
  2. 创建个人或企业实例
  3. 创建镜像仓库,这个仓库可以建多个,看自己
  4. 创建完毕之后可以根据阿里云提供的步骤进行推送或拉取

如果我们只是想用阿里云的镜像加速器,可以找到如下图操作即可。

自建仓库

  1. 拉取仓库镜像
docker pull registry
  1. 运行镜像
docker run -d -v /edc/images/registry:/var/lib/registry 
-p 5000:5000 
--restart=always 
--name xdp-registry registry
  1. 查看镜像信息
curl http://127.0.0.1:5000/v2/_catalog
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,273评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,349评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,709评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,520评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,515评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,158评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,755评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,660评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,203评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,287评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,427评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,122评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,801评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,272评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,393评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,808评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,440评论 2 359

推荐阅读更多精彩内容

  • docker常用命令详解 - CSDN博客 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的...
    Meathill大魔王阅读 817评论 1 2
  • docker的安装以及镜像,容器,仓库的基本操作 docker的安装(centos7中可以直接yum安装) yum...
    岑景阅读 354评论 0 5
  • Docker常用命令使用 docker ps列出容器使用语法:docker ps [options]options...
    StrongZhao阅读 641评论 0 0
  • Docker基础 这篇基础文章是方便用户在使用cSphere平台之前,了解docker基础知识。 针对已经有一定的...
    4ea0af17fd67阅读 458评论 0 0
  • 今天弘丹老师的每日一问到让我很有些感慨,五年后的自己会有什么样的生活呢?憧憬未来,让人有些期待又胆怯。期待因为那是...
    一颗猕猴呆阅读 352评论 3 6