Docker系列之使用

docker 镜像

      • 搜索镜像
      • 拉取Docker镜像
      • 删除镜像
      • 运行Docker镜像
      • Docker容器操作
      • 利用Dockerfile 制作镜像
            • 官方例子
          • 下面做个大概的解释
      • Docker仓库

搜索镜像

docker search 镜像名 [OPTION]

拉取Docker镜像

  • 前面已经修改了镜像源,所以这里会从我们指定的镜像源去下载镜像,命令以下。
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
  -q, --quiet                   Suppress verbose output

-a 下载这个镜像的所有版本
-q 静默下载。试了下,没下下来一直卡在那不动。。(后续再看看)
NAME 是包含了完整的名称的,类比Maven 就是 GA 两个属性,格式为
仓库地址/镜像名 ,而这个仓库地址又是 ip/域名:端口的形式;如不显式指定仓库地址,默认下载官方(docker.io/library/镜像名)的镜像。
:TAG 指定镜像的版本
@DIGEST 摘要下载,下载完毕后

例:docker pull docker.io/library/mysql:5.7

删除镜像

删除一个镜像	docker rmi (镜像名:标签)/镜像id
删除全部镜像	docker rmi $(docker images -aq)	
$():类似sql子查询的操作,将子查询的结果传递到外层操作的参数列表,很多场景都可以使用

运行Docker镜像

注意:这里的run是基于镜像创建新的容器,多次运行则会创建不同的容器。

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
// 这里只介绍基础用法,具体参考,具体镜像还有自己支持的命令,这个依镜像而定
docker run --help
docker run  IMAGE的id或者Docker 镜像的名称
-d 后台运行
--name 指定容器名称
-v 指定数据挂载目录 宿主机目录:容器目录
-p 端口映射 宿主机端口:容器端口 
-P 容器端口随机映射到宿主机端口
-e 设置环境变量 key=value
ps: 常见的一种命令
	基于镜像以交互式终端的形式启动并进入一个新的容器
	docker run -it 镜像id bash 

Docker容器操作

对于已经创建的容器,常用操作,基本使用容器id的地方均可用容器名称替换

// 启动
docker start 容器id
// 停止
docker stop 容器id
// 重启
docker restart
// 强制停止
docker kill
// 进入容器内部(【只有已经启动的容器才能执行】)
docker exec 容器id
与 docker run 类似,docker exec -it 容器id bash
docker ps [OPTION] 查看容器列表
-a 所有容器
-q 仅展示容器id

通过run 命令进入容器后,直接exit退出容器,此时容器会停止,若想退出时容器继续运行使用: ctrl + p + q 退出容器

删除容器
删除一个容器 docker rm 容器id
批量删除 docker rm $(docker ps -a)
强制删除 docker rm -f (容器id....)

docker logs 查看容器相关日志
-f 滚动日志 
-n		/ --tail  	200 显示多少行日志
其他参数 参考 --help

删除指定镜像创建的容器

删除带有mysql 关键字的容器 docker rm $(docker ps -a | grep mysql | awk '{print $1}')

查看容器内部进程信息		docker top 容器id

查看镜像/容器/网络等等元数据		docker inspect 对应的id或者名称



利用Dockerfile 制作镜像

docker build -t  镜像名称[:标签] 上下文目录(一般直接指定为Dockerfile所在目录就行了)
  • Dockerfile 格式及脚本常用命令

    官方例子
    FROM node:current-slim
    WORKDIR /usr/src/app
    COPY package.json .
    RUN npm install
    EXPOSE 8080
    

    自定一个简单tomcat环境

    FROM centos
    
    MAINTAINER asin2tk<111@qq.com>
    
    ENV mypath /user/local
    
    WORKDIR $mypath
    
    COPY readme.txt .
    
    ADD apache-tomcat-8.5.69.tar.gz . 
    ADD jdk-8u291-linux-x64.tar.gz .
    
    RUN yum -y install vim
    
    ENV JAVA_HOME /user/local/jdk1.8.0_291
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /user/local/apache-tomcat-8.5.69
    ENV CATALINA_BASE /user/local/apache-tomcat-8.5.69
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD startup.sh
    
    下面做个大概的解释

    FROM node:current-slim:类似Java中继承的意思,定制镜像的基础镜像,这是必须的,放在第一句。
    WORKDIR /usr/src/app:设置工作目录,由于Docker镜像有分层的概念,构建镜像时,每一个Dockerfile 命令都是处于不同的层,这个命令的作用是在构建镜像时,会自动切换到指定目录,不存在时自动创建,这个命令作用于后续的所有层;另外当我们进入容器时默认的目录也是这个目录。
    COPY package.json . : 就字面意思,将上下文目录里面的package.json复制到当前目录,看起来好像是从宿主机复制到容器内部,实际上,构建镜像的整个过程都是在Docker引擎内部完成的,构建之初,Docker会将整个上下文目录打包上传给Docker引擎,由Docker引擎去完成整个构建工作。
    RUN npm install:RUN 后面可以接 shell 命令或者可执行文件。
    EXPOSE 8080:声明对外暴露的端口,仅仅是声明而已。不影响镜像构建和容器运行。如果采用 docker run -P imageId 的方式运行容器,内部端口会使用这个端口。
    这里着重说明几个常用易混淆的命令

    1. ADD 和 COPY
      二者都是往容器内指定地方复制文件
      区别:
      ADD:支持文件,目录,远程url,并且会自当解压压缩文件
      COPY:支持文件目录,仅仅复制
    2. RUN CMD ENTRYPOINT
      三者都可以执行命令
      RUN:用于镜像构建过程中执行命令
      CMD 和 ENTRYPOINT:用于启动容器时,自动执行的命令
      其中CMD仅最后一个生效,且不能与启动时的命令参数相结合使用,只能指定完整的命令进行覆盖
      ENTRYPOINT 启动参数可以与预定义的命令行结合使用,可拼接完成指定操作

    若有文件目录操作,可以先行切换工作目录,而后在当前目录操作即可;如下

    ENV mypath /user/local
    
    # 切换工作目录到 /user/local
    WORKDIR $mypath
    # 此时复制到 . (当前目录)就变成了 /user/local
    COPYdemo.txt .
    

Docker仓库

  • Docker仓库,概念类似Maven仓库,存放Docker镜像的仓库。
  • 官方仓库 DockerHub ,平时使用 docker pull 镜像名称 等命令都是搜索的官方镜像,我们也可以推送自己的镜像到官方仓库;
    docker push docker登录名/镜像名称:标签
  • 私有仓库:
    官方提供一个镜像帮助构建私有仓库,docker-registry
    docker run -d -p 5000:5000 --name registry registry
    
    想要使用私有仓库,就可以直接指定仓库地址即可,
    docker pull 127.0.0.1:5000/镜像:标签
    docker push 127.0.0.1:5000/docker登录名/镜像名称:标签。
    如果想使用具体IP的形式拉取/推送镜像,默认配置可能会存在问题,如果失败,可以尝试修改配置文件 /etc/docker/daemon.json ,追加以下内容,ip视具体而定
    "insecure-registries": [
    "192.168.130.135:5000"
    ]
    
    重启docker服务
    systemctl restart docker
    

容器互联
所谓容器互联就是不同的容器之间建立的联系;
Docker创建容器默认在docker0网络下;容器间可以通过ip互相访问,类似微服务的概念一旦进行扩缩容或者ip发生变化,它们之间的通过ip建立的关系将变得不可用,此时需要以一个不变的量建立关系。
实现容器A连接到容器B

1.  docker run --name A --link B ....-d ...-p...
	此种方式的本质是在A的 /etc/hosts 中维护一个 类似 (B的ip B)这样的配置,达到以B的名称连接的目的  。

2. 自定义网络的
	由于docker0的桥接网络,不支持容器间以名称互相访问,但是自定义的网络是支持的,所以可以自定义一个网络实现
	docker network create -d bridge --subnet xxx.xxx.xxx.xxx/8 --gateway xxx.xxx.xxx.xxx mynet
	然后我们在启动容器时,指定连接到我们的自定义的网络即可
	docker run -d --network mynet .........
	如此,只要是运行在这个网络中的容器,都可以直接通过名称互相访问

然不同网络中的容器如何互联

docker network connect [OPTIONS] NETWORK CONTAINER
上述命令即将 容器接入到指定的网络中,这样位于该容器就可以和该网络中的其他容器进行通信。
不同容器之间无法直接通信,需经过被连接的容器所在网络桥接方式,即是将主动连接的容器接入被连接的容器所在的网络中就可以了	

你可能感兴趣的:(Docker,环境搭建,docker,eureka,容器)