Docker学习小记
先学会基本使用,再去了解其原理,相辅相成。
一、安装docker(CentOS版本建议在7以上,对docker支持更好)
yum install docker
安装完毕后可以查看版本:docker -v
查看使用说明:docker --help
参数
命令
启动docker:service docker start
二、镜像操作
列出镜像:docker images(目前什么都没有下载)
搜索镜像:docker search 镜像名
拉取镜像:docker pull 镜像名
拉取镜像前,可以先配置国内镜像源ustc:vi /etc/docker/daemon.json
花括号里添加一行:"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
重启docker服务生效配置:service docker restart
继续拉取镜像:docker pull centos:7
删除单个镜像:docker rmi IMAGE_ID(有容器在运行的镜像是不会被删除的)
删除所有镜像:docker rmi `docker images -q`(这里的反引号`是Esc下面的那个,有容器在运行的镜像也不会被删除的)
三、容器操作
1,查看容器
查看正在运行的容器:docker ps
查看所有容器(启动过的容器):docker ps -a
查看最后一次运行的容器:docker ps -l
2,创建与启动容器
创建容器:docker run
参数说明:-i:运行容器、-t:启动即进入容器命令行、--name:给容器命名,接=、-v:表示目录映射关系,宿主机目录:容器目录,可以用多个-v做多个映射、-d:守护式容器在后台运行、-p:端口映射,宿主机端口:容器端口,可以用多个-p做多个端口映射。
2.1,创建一个交互式容器并取名为mycentos:docker run -it --name=mycetnos centos:7 /bin/bash
此时已经入启动的容器伪终端命令行,打开另一个terminal,docker ps
可以看到一个Up的STATUS,即表示正在运行的容器
在容器命令行输入exit即可退出并关闭容器
这时使用docker ps看不到,需要用docker ps -a
2.2,创建守护式容器:docker run -id --name=mycentos-guard centos:7
出现上面这串字符串表示启动成功,进入容器:docker exec -it 容器名称(NAMES)/容器ID(CONTAINER ID) /bin/bash
此时exit并不会停止容器运行,需要:docker stop 容器名称(NAMES)/容器ID(CONTAINER ID)
需要再次启动时:docker start 容器名称(NAMES)/容器ID(CONTAINER ID)
3,文件拷贝
从宿主机中拷贝到容器中:docker cp 被拷贝文件或目录 容器名称:容器目录
从容器中拷贝到宿主机:docker cp 容器名称:容器目录 被拷贝文件或目录
4,目录挂载(挂载:即把设备放在一个目录下,让系统知道怎么管理这个设备里的文件)
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器时在-id后面加上:-v 宿主机目录:容器目录,如果共享的是多级目录会有权限不足,可以再加上参数:--privileged=true
docker run -id --name=mycentos-mount -v /usr/dir0315:/usr/local/dir0316 centos:7
容器创建成功,在宿主机里对该目录下的操作,在容器里都会同步
5,查看容器运行的数据
查看所有数据:docker inspect 容器名称
查看ip地址:docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称
6,删除容器(只能删除停止运行的容器)
删除单个容器:docker rm 容器名称(NAMES)/容器ID(CONTAINER ID)
删除所有容器:docker rm `docker ps -a -q`
五、部署应用
1,部署mysql到容器:docker run -id --name=contains_mysql -p 33306:3306 -e MYSQL_PASSWORD=123456 mysql
启动成功后,在自己的windows下通过navicat连接容器mysql
测试连接,连接成功后登录即可对容器mysql进行操作
docker理解:
镜像与容器的关系。
镜像本质就是一个压缩文件,可以export出一个类似linux根目录的目录结构。docker镜像分层结构即镜像是由一系列只读的层组成,每一个命令都会在只读层上创建一个新的层,最终的镜像就是层层叠加而成。
而容器就是基于镜像层层叠加的基础上在最上层创建一个可读写的层,所以一个镜像可以对应到多个容器(即多个可读写的层),运行容器时的操作都是对这个容器对应的读写层的操作,不会影响到镜像本身。
Namspaces(命令空间)(虚拟资源):Linux提供的用于分离进程数、网络接口、挂载点以及进程间通信等资源的方法。Linux提供了七种命令空间。
服务器上启动了多个服务的话是会互相影响的,并且可以随意查看宿主机上的服务和文件,基于安全和一致性考虑,我们更希望的是不同服务之间能够完全隔离。
进程隔离(CLONE_NEWPID):宿主机和容器之间的进程应该是相互隔离开来。
每次docker run/docker start时,会设置一个进程间隔离的Spec,最后将Spec作为创建容器的参数进行设置。
网络隔离(libnetwork):容器需要通过宿主机与外界网络相连才能发挥作用。
docker默认为网桥模式:docker启动后会在主机上创建一个虚拟网桥dockero,后续启动的全部服务都默认与该网桥相连接。
当外界访问宿主机ip:端口时,dockero通过iptables的前置路由规则将地址定向到容器ip,再根据映射的端口号访问容器。
所以我们在连接容器的时候,用的是宿主机的ip地址和端口,经过重定向和映射,就找到了容器。
挂载点(CLONE_NEWNS):容器中的进程不应该直接访问或者修改宿主机的其他目录。
在创建隔离挂载点命名空间时传入CLONE_NEWNS,使子进程得到父进程挂载点的拷贝,否则子进程对文件系统的读写会同步到父进程和整个主机文件系统。
同时需要通过libcontainer提供的pivot_root或者chroot函数改变进程可以访问文件目录的根节点。
CGroups(控制组)(物理资源):Linux提供的一种可以限制、记录、隔离进程组使用物理资源(CPU、内存、磁盘I/O、网络等)的机制。
当同一台机器上运行多个容器时,假如某一个容器正在大量消耗物理资源,那么势必就会影响到其他容器,因此需要CGroups来分配物理资源。
在CGroup中,所有的任务就是一个系统的一个进程,而CGroup就是一组按照某种标准划分的进程,在CGroup机制下,所有的资源控制都是以CGroup作为单位来实现,每一个进程都可以随时加入或退出一个CGroup(进程通过加入/退出CGroup来使用/释放资源)。
当我们运行一个docker容器时,Docker会为这个容器在子系统(如cpu子系统)目录下docker目录下创建一个与容器标识符相同的CGroup,而每一个CGroup下面都有一个tasks文件,其中存储着属于当前控制组的所有进程的pid,因此cpu.cfs_quota_us文件就可以对cpu的使用作出限制。所以,当想要控制某个容器的资源使用率,就可以直接改变这个文件的内容。
当关闭正在运行的容器时,Docker会移除子控制组对应的文件夹,实际上Docker在使用CGroup时其实也就是做了一些创建文件夹改变文件内容的操作。