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

你可能感兴趣的:(Docker 概念、命令、DockerFile等看这篇就够了)