Docker基础

一、安装Docker

  1. yum list | grep docker //由于yum仓库里的docker可能不是最新版的,所以不建议用yum安装,推荐使用curl执行远程脚本的方式从docker官网安装
    yum update -y
    yum remove docker docker-common docker-selinux docker-engine docer-io //如果安装过老版本的需要执行命令【彻底】卸载
  2. curl -fsSL https://get.docker.com/ | sh //执行docker官方的安装脚本,安装最新版本
  3. 测试是否安装成功:docker version会显示各种版本信息

二、配置镜像加速

鉴于国内网络问题,后续拉取Docker镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com
新版的Docker使用json配置文件/etc/docker/daemon.json(Linux)
请在该配置文件中加入(没有该文件的话,请先建一个):

{ 
  "registry-mirrors": ["https://mirror.ccs.tencentyun.com", "https://3laho3y3.mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn"] 
}

三、执行用户组

创建用户组:groupadd docker
将用户添加到组中:usermod -aG docker youn

四、启动服务

  1. systemctl start docker或者service docker start //启动命令
1.Docker daemon( Docker守护进程):Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。
2.Client( Docker客户端):Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build等都是 Docker的相关命令。
3.Images( Docker镜像):Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像,使用系统安装光盘可以安装系统,同理,使用Docker镜像可以运行 Docker镜像中的程序。
4.Container(容器):容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。可通过 Docker API或者 CLI命令来启停、移动、删除容器。
5.Registry:Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,就需要手动复制。此时可借助Docker Registry来避免镜像的手动复制。一个 Docker Registry可包含多个 Docker仓库,每个仓库可包含多个镜像标签,每个标签对应一个 Docker镜像。这跟 Maven的仓库有点类似,如果把 Docker Registry比作Maven仓库的话,那么 Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。Docker Registry可分为公有Docker Registry和私有Docker Registry。 最常用的DockerRegistry莫过于官网的Docker Hub, 这也是默认的Docker Registry。 Docker Hub上存放着大量优秀的镜像, 我们可使用Docker命令下载并使用。

五、Docker版Hello World测试

1. 拉取hello-world镜像:docker pull hello-world
2. 查看服务中的镜像列表:docker images
	docker history repository:tag  //查看镜像的变更历史,包括构建层级
3. 查看服务器中运行的容器:docker ps  //添加-l选项可以查看最近被创建的容器
4. 运行容器
	docker run hello-world  //如果打印出Hello from Docker!表示运行正常
	1.交互式:docker run -it centos:latest  //选项i表示启动一个交互式容器,用户退出容器后容器随即销毁,可以用exit或CTRL+D退出容器。
			  t选项表示启动容器后打开一个命令行terminal,可以在这个terminal执行容器内命令
	2.后台式:docker run -d centos:latest  //选项d表示启动一个后台式容器,用户不会登进容器,保持后台运行。
5. 根据容器唯一ID查看容器的运行日志:docker logs -f 2263e10d958b  //选项f表示实时显示,类似tail -400f命令
6. 根据容器唯一ID停止容器:docker stop 2263e10d958b

六、载入web应用:docker pull training/webapp //拉取示例web应用镜像

			 docker run -d -P training/webapp python app.py  //开启容器,-P:将容器内部使用的网络端口映射宿主机的随机端口上,flask的是5000,会将主机的32768端口映射上去。
			 docker run -d -p 8888:500 training/webapp python app.py  //开启容器,-p:将容器内部使用的网络端口映射宿主机指定端口上,flask的是5000,会将主机的8888端口映射上去。
			 curl localhost:32768  //测试web应用,返回hello world表示正常
			 
			 docker run --name=containerName centos:imageName  //自定义名称启动容器
			 docker run --name "containerName" centos:imageName  //自定义名称启动容器

七、查看容器端口:

1. docker ps  //查看运行中的容器
2. docker ps -a  //查看所有容器,包括启动而未运行的
2. docker port containerName  //可以跟容器名称或唯一ID作为参数

八、查看容器中的进程列表:

docker top containerName  //也可以是唯一ID作为参数

九、查看容器度量参数:

docker inspect 25b59eb18121  //以JSON格式返回容器的一系列参数

十、停/启一个容器:

docker stop 25b59eb18121  //停止容器
    docker kill 25b59eb18121  //杀死容器
docker start 25b59eb18121  //容器停止后,还可以用上次的ID或者名称重启容器(并非新建容器)
docker cp containerId:containerPath hostPath  //将容器内路径下的数据拷贝到宿主机目录下

十一、查看docker服务器整体信息:

docker info

十二、根据镜像创建自定义名字的镜像:

docker create --name="yang-centos" centos:latest

十三、删除已停止容器

docker rm dreamy_roentgen

十四、在DockersHub中查找镜像

docker search coreos

十五、更新镜像【更新容器内的yum库或者apt库】

1.docker run -it centos:latest  //用旧镜像启动一个容器
2.yum update  //在容器内执行yum库更新操作
3.docker commit -m="yang's first entos image" -a="yang" 2ab20c209cd2 centos:centos-v7-yang  //基于已有容器,提交一个新的镜像到本地仓库

十六、删除镜像

docker rmi centos:myCentos7

十八、启动和进入容器最佳实践:

1.docker run -it --name myCentos centos:latest  //首先启动容器,并以交互是命令行形式进入容器
2.待内部操作完成后使用CTRL+P+Q组合键静默退出,这样退出后容器任然会运行,不会停止
	还有一种不推荐的退出方式,直接用exit命令退出,此时容器会停止运行,然后再用restart myCentos命令重启容器
3.docker attach myCentos  //再次进入容器命令行界面进行其他操作
4.docker exec -it myCentos bash

十九、

1.编写DockerFile构建文件
	FROM scratch  //所有镜像的基镜像,类似基类
	ADD centos-7-docker.tar.xz /

	LABEL org.label-schema.schema-version = "1.0" 
		org.label-schema.name="CentOS Base Image" 
		org.label-schema.vendor="CentOS" 
		org.label-schema.license="GPLv2" 
		org.label-schema.build-date="20180531"

	CMD ["/bin/bash"]  //启动容器后容器内默认执行的命令
2.执行docker build -f fileName -t repsitoryName:tagName . 命令构建一个docker镜像
  docker build -f DockerFile0 -t centos:ipcn .  //注意句点
3.执行docker run命令用镜像启动一个容器

二十、数据卷

1.概念:宿主机和容器间、容器与容器间共享存储介质,实现数据的持久化和数据共享。
2.数据卷中的数据可以在容器间共享和重用。
3.数据卷中数据的更改可以实时生效。
4.数据卷中的数据不会包含到镜像中去。
5.数据卷的生命周期会持续到没有容器引用它为止。

6.为容器添加数据卷:
	1.容器内添加
	2.外部命令
		docker run -it imageName -v hostPath:containerPath:ro imageName /bin/bash  //将宿主机的指定目录映射到容器中的指定目录,两个目录任意一个不存在都会自动创建
		:or  //表示容器内只读,不可写
		docker inspect containerName  //可以查看容器数据卷映射情况即读写权限
		映射成功后,不论容器是否在运行,在任意一方对数据卷进行写操作都会在两方生效
	3.DockerFile
		VOLUME ["containerPath1", "containerPath2"]  //生成的镜像,会在容器启动时中生成多个目录
		可以用docker inspect命令查看容器内目录映射到了宿主机的默认位置
7.数据卷容器:如果某个容器用来被继承,使其数据卷传递到子容器的容器就称为数据卷容器。
	docker run -it --name dataContainerParent centos:v7 /bin/bash  //启动一个父容器作为数据容器
	docker run -it --name son1 --volums-from dataContainerParent centos:v7 /bin/bash  //启动第一个自容器,会原封继承父容器的数据卷
	docker run -it --name son1 --volums-from dataContainerParent centos:v7 /bin/bash  //启动第一个自容器,会原封继承父容器的数据卷
	删除父容器,子容器也能访问数据卷,直到最后一个容器。

二十一、DockerFile的构建过程

一、基础知识

1.保留关键字指令必须为大写字母,且其后至少跟一个参数
2.指令按照从上到下顺序执行
3."#"用于注释
4.每条指令都会创建一个新的镜像曾,并自动对镜像进行提交

二、DockerFile执行流程

1.docker从基础镜像运行一个容器
2.执行一条指令并对容器做出修改
3.执行类似docker commit的操作提交一个新镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile的下一条指令,直到执行完所有指令
6.有的centos基础镜像没有安装网络服务需要用yum安装
	yum -y install net-tools

三、保留关键字

FROM  #基础镜像,可以是祖先镜像,也可以是其他自定义镜像
MAINTAINER  #作者
RUN  #镜像构建时需要运行的额外命令
EXPOSE  #启动后容器对外暴露的端口号
WORKDIR  #用户登录容器后的初始工作目录
ENV  #在构建过程中设置环境变量,跟key-value型参数,可在其他地方应用
COPY  #将构建上下文目录中(即当前执行build命令的宿主机目录)的文件或目录复制到新的一层镜像(目的路径)位置
ADD  #包含COPY的功能,同时还会自动对url和压缩文件进行访问和解压处理
VOLUME  #用于数据保存和持久化工作
CMD  #指定容器启动时要执行的命令,一个dockerFile中可以有多个CMD命令,但容器启动时只有最后一个会生效,且当用docker run启动容器时会被其后跟有命令时,这些内置的命令都不会生效,会被覆盖
ENTEYPOINT  #与cmd命令功能相同,但其后命令不会被docker run命令后所跟的命令覆盖,而是以追加的方式拼接到之前的命令后面
ONBUILD  #指定一个被动触发指令,当此镜像被某子镜像继承(构建子镜像时),本命令就会被触发执行
原文地址:https://www.cnblogs.com/JaxYoun/p/12778498.html