docker 操作镜像的基本操作
以安装mysql为例
1.拉取镜像
docker pull mysql
这样写会拉区mysql的最新版本
错误的启动 [root@localhost ~]# docker run --name mysql01 -d mysql //--name是给容器泣别名 -d是后台运行 42f09819908bb72dd99ae19e792e0a5d03c48638421fa64cce5f8ba0f40f5846 mysql退出了 [root@localhost ~]# docker ps -a //显示正在运行的或者过去运行的镜像版本 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 42f09819908b mysql "docker-entrypoint.sh" 34 seconds ago Exited (1) 33 seconds ago mysql01 538bde63e500 tomcat "catalina.sh run" About an hour ago Exited (143) About an hour ago compassionate_ goldstine c4f1ac60b3fc tomcat "catalina.sh run" About an hour ago Exited (143) About an hour ago lonely_fermi 81ec743a5271 tomcat "catalina.sh run" About an hour ago Exited (143) About an hour ago sick_ramanujan //错误日志 [root@localhost ~]# docker logs 42f09819908b //查看镜像的运行日志 error: database is uninitialized and password option is not specified You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD;这个三个参数必须指定一个
正确的启动 [root@localhost ~]# docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 -d mysql b874c56bec49fb43024b3805ab51e9097da779f2f572c22c695305dedd684c5f [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b874c56bec49 mysql "docker-entrypoint.sh" 4 seconds ago Up 3 seconds 3306/tcp
做了端口映射 [root@localhost ~]# docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql ad10e4bc5c6a0f61cbad43898de71d366117d120e39db651844c0e73863b9434 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ad10e4bc5c6a mysql "docker-entrypoint.sh" 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp my
当关闭后想要再次启动 首先要知道你做了容器映射后的id 找到指定的id,就可以启动容器了
[root@localhost ~]# docker ps -a /etc/sysconfig/docker: line 4: PTIONS: command not found /etc/sysconfig/docker: line 5: /bin/bash:: No such file or directory CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 707b4adac44f mysql "docker-entrypoint..." About an hour ago Up 5 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql02 e705dafeade2 mysql "docker-entrypoint..." About an hour ago Exited (0) About an hour ago mysql01 67d6a8fe057e tomcat "catalina.sh run" 14 hours ago Exited (143) 14 hours ago gracious_cray 72ea521cf5cc tomcat "catalina.sh run" 15 hours ago Exited (143) 14 hours ago mytomcat
执行这一步操作后就可以连接navicate进行数据库操作了。
[root@localhost ~]# docker start 707b4adac44f087 /etc/sysconfig/docker: line 4: PTIONS: command not found /etc/sysconfig/docker: line 5: /bin/bash:: No such file or directory 707b4adac44f087 [root@localhost ~]# docker ps /etc/sysconfig/docker: line 4: PTIONS: command not found /etc/sysconfig/docker: line 5: /bin/bash:: No such file or directory CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 707b4adac44f mysql "docker-entrypoint..." About an hour ago Up 9 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql02
Docker的镜像原理
镜像是一种轻量级的,可独立执行的软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件运行的所有内容,包括代码,运行时所需要的库,环境变量和配置文件。
为什么docker镜像文件会那么大
镜像是一个千层饼,采用了联合文件系统UnionFS (联合文件系统)Union文件系统是一种分层,轻量级并且高性能的文件系统,他在线hi吃对文件系统的修改作为一次提交来一层一层的叠加,同时可以将不同的目录挂载到
同一个虚拟文件系统下,Union文件系统是Docker镜像的基础。镜像是可以通过分层继承,基于基础镜像(没有父镜像),可以制作各种应用的镜像。
特性:一次加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把隔层文件叠加起来,这样最终的文件系统包含所有的底层的文件和目录
Docker镜像的加载原理
docker镜像实际上是由一层一层的文件系统组成bootfs(boot file system) 主要包含boot 和kernel ,bootloader 主要是引导加载kernel linux刚启动时会加载bootfs文件系统再docker 镜像的最底层就是bootfs.这一层与linux 、unix的文件系统是一样的包含boot加载器和(bootLoader)内核(kernel) 当boot加载完后整个内核就在内存中了,此时的内存使用权已由bootfs转交给内核 此时会卸载bootfs.
rootfs(root file system) 在bootfs之上,包含的就是典型linux系统中的/dev /opt /bin /tmp 等标准的目录和文件 rootfs就是不同的各种操作系统的发行版比如:/Centos /ubuntu 等等
我们平常安装到虚拟机的centos都有 1到几个GB 为什么docker 这里才200MB呢 对于一个精简的os rootfs可以很小只需要包括最基本的命令,工具和程序库就可以了,因为底层直接使用Host 的kernel 自己只需要提供rootfs就可以了
由此可见不同的linux 的发行版本 他们的rootfs是一致的rootfs 是有差别的因此不同的发行版可以共用bootfs
为什么docker镜像要采用这种分层结构:
最大的一个好处就是资源共享,比如有好几个镜都是从相同的base镜像构建而来,那么宿主机中只需要保留一份base镜像就可以了,同时内存中也只需要加载一份base进镜像就可以了,就可以为所有容器服务了,而且镜像的每一次呢个都可以资源共享
特点:docker 镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶层,这一层通常被称为容器层,容器层之下的都叫镜像层。
Docker容器数据卷:
数据卷是什么:简单说就是做数据持久化的磁盘,硬盘,u盘,或者类似于Redis的中的rdb aof 文件 主要做数据的持久化 和容器之间数据的共享。卷就是目录或者文件存在一个或者多个容器中由docker 挂在到容器,但户数与联合文件系统
因此能否绕过Union file system 提供一些的用于持久存储或者共享数据的特性卷设计的目的就是为了数据的持久化,完全独立于容器的生命周期因此docker不会再容器删除时删除其关在的数据卷。
数据卷的特点:
1.数据卷可在容器之间共享或者重用数据
2.卷中的更改可以直接生效
3.数据卷的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用他为止
5.数据卷也可以完成主机到容器或者容器到主机的数据共享
添加数据卷
容器中添加数据卷有两种办法第一种直接命令添加第二种使用dockerfile添加
命令添加:
待续:::