Docker

docker安装

#方式一: 认版本安装
yum install docker

#方式二:最新版本安装
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-re/linux/centos/docker-ce.repo
yum install docker-ce

#注意:CentOS6并没有docker源,可以使用EPEL库安装docker
yum install http://mirros.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
yum install docker-io

docker常用命令

#查看docker版本信息
docker version
docker info

#启动docker
systemctl start docker
service docker start

#设置随机启动
chkconfig docker on

容器操作

docker [run|start|stop|restart|kill|rm|pause|unpause]
 	- run/create [镜像名]  # 创建一个新的容器并运行 / 创建一个容器,但不启动
		  	-d: 后台运行容器,并返回容器ID;
			-i: 以交互模式运行容器,通常与 -t 同时使用;
			-p: 端口映射,格式为:主机(宿主)端口:容器端口
			-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
			--name="Nginx-lb": 为容器指定一个名称;
			--dns 8.8.8.8: 指定容器使用的DNS服务器认和宿主一致;
			-m :设置容器使用内存最大值;
			--net="bridge": 网络连接类型,支持 bridge/host/none/container: 四种类型;
			--link=[]: 添加链接到另一个容器;
			--expose=[]: 开放一个端口或一组端口;
 	- start/stop/restart [容器名]  #启动/停止/重启一个容器
 	- kill [容器名] #直接杀掉容器,不给进程响应时间
 	- rm [容器名]  #删除已经停止的容器
 			-f #强制删除,可以删除正在运行的容器
 	- pause/unpause [容器名] #暂停/恢复容器中的进程

docker [ps|inspect|exec|logs|export|import]
 	- ps #查看容器列表(认查看正在运行的容器,  -a 查看所有容器)
 	- inspect[容器名]  #查看容器配置元数据
 	- exec -it [容器名] /bin/bash   #进入容器环境中交互操作
 	- logs -since="2020-02-01" -f -tail=10 [容器名]  #查看容器日志
 	- cp path [容器名]:path  #容器与主机之间的数据拷贝
 	- export -o test.tar [容器名] / export [容器名]>test.tar  #文件系统作为一个tar归档文件
 	- import test.tar [镜像名:版本号]  #导入归档文件,成为一个镜像

镜像操作

docker [images|rmi|tag|build|history|save|load]
 	- images  #列出本地镜像列表
 	- rmi [镜像名:版本]  #删除镜像
 	- tag [镜像名:版本] / [镜像名:版本] [仓库]  #标记本地镜像,将其归入某一仓库
 	- build -t [镜像名:版本] [path]  #创建镜像
 	- history [镜像名:版本]  #查看指定镜像的创建历史
 	- save -o xxx.tar [镜像名:版本] / save [镜像名:版本]>xxx.tar   #将镜像保存成tar归档文件
 	- load --input xx.tar / load<xxx.jar  #从归档文件加载镜像  

仓库操作

docker官方仓库: https://hub.docker.com
-------- 自由注册邮件激活

Docker  [pull/search/login/push/tag]
	search:在仓库中查询镜像 – 无法查询到tag版本
	pull: 下载镜像到本地
	tag: 标记本地镜像,将其归入某一仓库
	push: 推送镜像到仓库  --需要登陆
	login:登陆仓库
#查询所有jdk的镜像(本地和远程)
docker search jdk

#拉取指定的镜像
docker pull docker.io/gmaslowski/jdk

#标记jdk ,将其归入私服仓库
docker tag docker.io/gmaslowski/jdk  192.168.227.133:5000/OracleJDK8

#将OracleJDK8推送至私服仓库
docker push 192.168.227.133:5000/OracleJDK8

#登录,一般对官方仓库操作时使用、私服并不需要登录
docker login

私服仓库创建

  • 修改docker配置

    vim /etc/docker/daemon.json
    	
     	#内容如下
     	{
     	 "bip":"172.17.5.1/24",
    	 "registry-mirrors":["https://registry.docker-cn.com"],
    	 "insecure-registries":["192.168.227.133:5000"]
    	}
    	
    	#bip 配置容器创建的ip段
    	#registry-mirrors  镜像认下载地址,[加速器]
    	#insecure-registries  开放http - 私服认只能使用https,需要配置
    
  • 重启docker

    systemctl daemon-reload 
    systemctl restart docker
    
  • 下载registry镜像,并启动

    docker pull registry
    docker run -d --name reg -p 5000:5000 registry
    
  • 推送镜像到私服仓库

    docker  tag  hello-world   192.168.227.133:5000/hello-world 
    docker push 192.168.227.133:5000/hello-world
    
  • 查看

    #查询仓库镜像
    curl http://192.168.227.133:5000/v2/_catalog
    
    #查询镜像版本(如 查看hello镜像版本)	  
    curl http://192.168.227.133:5000/v2/hello/tags/list 	
    

常用命令详情

  • 创建

    #交互式创建容器并进入(前台进程)
    docker run -it --name cent centos:latest  /bin/bash  
    
    #创建容器并后台启动容器 (-d 后台运行 -it 交互shell进程)
    #如果不加 it 后台启动容器后会立马关闭容器的运行. 因为容器不知道干什么的时候回立刻退出. -it 会创建一个交互shell进程
    docker run -dit --name cent centos
    
    #创建容器并绑定容器端口到主机
    docker run -dit -p 8080:80 --name Nginx Nginx:latest
    
    #创建容器 并绑定容器端口到主机 和 启动Nginx	
    docker run -d -p 80:80 --name Nginx ce-Nginx  /usr/sbin/Nginx  -g  "daemon off;"
    		ps:后面运行的命令都是容器命令,由于Nginx命令没有设置到path中,所以全路径启动,
    		而Nginx -g这个参数是指可以在外面添加指令到Nginx配置文件中,
    		daemon off是指Nginx服务不运行在后端,而是在前台运行(container中的服务必须运行在前台)
    
    #进入已运行的容器
    docker exec -it Nginx /bin/bash
    
  • 数据管理

    docker容器运行,产生一些数据/文件/等等持久化的东西,不应该放在容器内部。应当以挂载的形式存在主机文件系统中。

    #volume参数创建容器数据卷
    docker run --name data -v /opt/data -it centos /bin/bash
    	
    #指定宿主机目录挂载文件 (注意 : 号后面必须是以 / 开头,否则容器将无法创建目录 而启动失败)
    docker run --name data1 -v /opt/data:/data -it centos /bin/bash
    
    #创建一个新的容器 挂载 与指定容器 相同的文件目录
    docker run -it --rm --volumes-from data1 --name app centos /bin/bash
    

    docker inspect data 查看

    在这里插入图片描述


    docker inspect data1 查看

    在这里插入图片描述


    docker inspect app 查看 (与data1容器相同 )

    在这里插入图片描述

  • 其他

    #将某个容器提交成为一个镜像 
    docker commit cent cent-ng:v1
    
    #退出容器
    exit 退出容器(由前台进程创建进入的容器 会关闭容器,由后台进程创建进入的容器 不会关闭容器);  
    Ctrl + P + Q 退出关闭容器;
    
    #复制主机文件到容器内
    docker cp anac.cfg cent:/var 
    

Dockerfile的使用(文件名必须是 Dockerfile)

  • Dockerfile 指令

    在这里插入图片描述

    FROM:
      FROM {base镜像}
      必须放在DOckerfile的第一行,表示从哪个baseimage开始构建 
      
    MAINTAINER:
    	可选的,用来标识image作者的地方
    	
    RUN 
    	RUN都是启动一个容器、执行命令、然后提交存储层文件变更。
    	第一层 RUN command1 的执行仅仅是当前进程,一个内存上的变化而已,其结果不会造成任何文件。
    	而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建
    	过程中的内存变化。而如果需要将两条命令或者多条命令联合起来执行需要加上&&。
    	如:cd /usr/local/src && wget xxxxxxx
    	
    CMD:
      CMD的作用是作为执行container时候的认行为(容器认的启动命令)
      当运行container的时候声明了command,则不再用image中的CMD认所定义的命令
    	一个Dockerfile中只能有一个有效的CMD,当定义多个CMD的时候,只有最后一个才会起作用
    
    EXPOSE 
    	EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开
    	启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服
    	务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 
    	时,会自动随机映射 EXPOSE 的端口。
    	
    ENTRYPOINT:
    	entrypoint的作用是,把整个container变成可执行的文件,且不能够通过替换CMD的方法来改变创建
    	entrypoint的方式。但是可以通过参数传递的方法影响到entrypoint内部
    	每个Dockerfile只能够包含一个entrypoint,多个entrypoint只有最后一个有效
    	当定义了entrypoint以后,CMD只能够作为参数进行传递
    
    ADD & copY:
      把host上的文件或者目录复制到image中(能够进行自动解压压缩包)  
      
    ENV:
      用来设置环境变量,后续的RUN可以使用它所创建的环境变量 
      
    workdir:
      用来指定当前工作目录(或者称为当前目录) 
      
    USER:
      运行RUN指令的用户 
      
    VOLUME:
      用来创建一个在image之外的mount point
    
    
  • CMD Dockerfile文件

    # base image
    FROM centos
    
    #CMD echo "hello cmd"
    CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]
    
    #使用Dockerfile创建CMD镜像( 最后的一个 .  表示在当前目录找Dockerfile文件 )
    docker build -t cmd .
    
    #使用CMD镜像创建一个cmd容器
    docker run -it cmd
    
  • Nginx Dockerfile

    # base image
    FROM docker.io/mamohr/centos-java:latest
    
    # MAINTAINER
    MAINTAINER Jaye
    
    # put Nginx-1.13.2.tar.gz
    ADD Nginx-1.13.2.tar.gz /usr/local/src
    
    # running required command
    RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel &&  yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel && useradd -M -s /sbin/nologin Nginx
    
    # change dir to /usr/local/src/Nginx-1.13.2
    workdir /usr/local/src/Nginx-1.13.2
    
    # execute command to compile Nginx
    RUN ./configure --user=Nginx --group=Nginx --prefix=/usr/local/Nginx --with-file-aio  --with-http_ssl_module  --with-http_realip_module    --with-http_addition_module    --with-http_xslt_module   --with-http_image_filter_module    --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module --with-http_flv_module    --with-http_mp4_module --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module   --with-http_secure_link_module   --with-http_degradation_module   --with-http_stub_status_module && make && make install
    
    EXPOSE 80
    
    ENV PATH /usr/local/Nginx/sbin:$PATH
    CMD ["/bin/bash", "-c", "Nginx -g 'daemon off;'"]
    
    
    #使用Dockerfile创建CMD镜像( 最后的一个 .  表示在当前目录找Dockerfile文件 )
    docker build -t ce-Nginx .
    
    #使用CMD镜像创建一个cmd容器
    docker run -d -p 80:80 --name Nginx ce-Nginx
    
  • 工程项目 Dockerfile

    # base image
    FROM docker.io/gmaslowski/jdk
    
    # MAINTAINER
    MAINTAINER Jaye
    
    #Dockerfile不支持指定文件目录挂载
    VOLUME /tmp/logs/task
    
    ADD ["task.jar", "web.jar"]
    EXPOSE 8081
    ENTRYPOINT ["java","-jar","/web.jar"]
    
    docker build -t task .
    
    docker run -d -p 8081:8081 -v /tmp/logs/task:/tmp/logs/task --name task task
    
    #项目配置
    server.port=8081
    logging.file.path=/home/task/logs/
    

JayeTian 发布了23 篇原创文章 · 获赞 7 · 访问量 1651 私信 关注

相关文章

Docker是什么Docker是 Docker.Inc 公司开源的一个基于 LXC技...
本文为原创,原始地址为:http://www.cnblogs.com/fengzheng...
镜像操作列出镜像:$ sudo docker imagesREPOSITORY TAG IMA...
本文原创,原文地址为:http://www.cnblogs.com/fengzheng/p...
在 Docker 中,如果你修改了一个容器的内容并希望将这些更改...
在Docker中,--privileged 参数给予容器内的进程几乎相同的权...