- 一、centos 7 下 docker安装
- 二、容器命令
- 三、常用的其他命令
- 四、Docker镜像讲解
- 五、容器数据卷
#运行容器,数据挂载 #安装MYSQL,配置密码
#官方测试:">获取镜像 [root@localhost ~]# docker pull mysql
#运行容器,数据挂载 #安装MYSQL,配置密码
#官方测试:- 启动mysql
-d后台运行-p端口映射-v卷挂载-e环境配置docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
一、centos 7 下 docker安装
1、卸载旧版本
yum remove docker \ docker-clent ;
2、需要的安装包
3、设置镜像的仓库
yum-config-manager \
—add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #阿里云镜像
4、更新yum软件包索引
5、安装docker
yum install docker-ce docker-ce-cli containerd.io #ce代表社区版 ee企业版
6、启动docker
7、使用docker version 看是否安装成功
[root@localhost /]# docker versionClient: Docker Engine - CommunityVersion: 19.03.13API version: 1.40Go version: go1.13.15Git commit: 4484c46d9dBuilt: Wed Sep 16 17:03:45 2020OS/Arch: linux/amd64Experimental: falseServer: Docker Engine - CommunityEngine:Version: 19.03.13API version: 1.40 (minimum version 1.12)Go version: go1.13.15Git commit: 4484c46d9dBuilt: Wed Sep 16 17:02:21 2020OS/Arch: linux/amd64Experimental: falsecontainerd:Version: 1.3.7GitCommit: 8fba4e9a7d01810a393d5d25a3621dc101981175runc:Version: 1.0.0-rc10GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dddocker-init:Version: 0.18.0GitCommit: fec3683
8、测试hello-world docker run hello-world
root``[@localhost ](/localhost )`` /]# docker run hello-worldUnable to find image 'hello-world:latest' locally #没有找到镜像latest: Pulling from library/hello-world #远程拉取镜像0e03bdcc26d7: Pull complete #拉取完成+签名Digest: sha256:4cf9c47f86df71d48364001ede3a4fcd85ae80ce02ebad74156906caff5378bcStatus: Downloaded newer image for hello-world:latest
Hello from Docker!This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
The Docker client contacted the Docker daemon.The Docker daemon pulled the "hello-world" image from the Docker Hub.(amd64)The Docker daemon created a new container from that image which runs theexecutable that produces the output you are currently reading.The Docker daemon streamed that output to the Docker client, which sent itto your terminal.
To try something more ambitious, you can run an Ubuntu container with:$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:[https://hub.docker.com/](https://hub.docker.com/)
For more examples and ideas, visit:[https://docs.docker.com/get-started/](https://docs.docker.com/get-started/)
9、docker images 查看镜像
10、卸载docker
卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
删除资源
rm -rf /var/lib/docker
11、docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker —help #帮助命令
12、docker search 搜索镜像
root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10048 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3682 [OK]
#可选项、通过搜索来过滤
—filter=STARS=3682 搜索出来的镜像就是 STARS=3682
[root@localhost ~]# docker search mysql —filter=STARS=3682
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10048 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3682 [OK]
13、docker pull mysql 拉取下载
二、容器命令
说明:有了镜像才可以创建容器
docker pull centos
1、新建容器并启动
docker run [可选参数 ] image
#参数说明
—name=”Name” 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P 随机指定端口
列出所有运行的容器
docker ps 命令
#列出当前正在运行的容器
-a 列出当前正在运行的容器,带出历史运行过的容器
-n=?显示最近创建的容器
-aq只显示容器编号
2、退出容器
exit 直接退出容器并停止
ctrl + p +q 退出容器不停止
3、删除容器
docker rm 容器ID #删除指定容器(不能删除正在运行的容器,强制删除rm -f)
docker rm -f $(docker ps -aq}) #删除所有容器
docker ps -a -q | xargs docker rm #删除所有的容器
4、启动和停止容器的操作
docker start 容器IDdocker restart 容器IDdocker stop 容器IDdocker kill 容器ID
三、常用的其他命令
1、后台启动命令
#命令 docker run -d 镜像名[root@localhost ~]# docker run -d centos
#docker ps 发现容器启动后停止了,要容器后台运行,必须有一个前台进程,如过docker发现没有进程
2、查看日志
docker logs -f -t tail 10 容器ID
3、查看容器中的进程信息
4、查看容器中的元数据
5、进入正在运行的容器
docker exec -it 容器ID /bin/bash #进入容器后开启一个新的终端,可以重复使用
docker attach 容器ID #进入容器正在执行的终端,不会启动新的进程
6、从容器内拷贝文件到主机上
docker cp 容器ID:源文件路径 目标路径例:docker cp 025fea80735b:/home/jun.java /home
学习:安装NGINX
1、查找镜像 docker search nginx
2、下载镜像 docker pull nginx
3、启动nginx
#-d 后台运行
#—name 给容器命名
#-p 宿主机端口:容器内部端口
[root@localhost sha256]# docker run -d —name nginx01 -p 8080:80 nginx
4、进入容器
docker exec -it nginx01 /bin/bash
四、Docker镜像讲解
1、镜像是什么
镜像是一种轻量级,可独立运行的软件包,用来打包运行环境和基于运行环境开发的软件,他包含运行某个软件 所需的所有内容,包括代码、运行时、库、环境变量和配置文件 ;
所有的应用,直接打包docker镜像,就可以直接跑起来
如何得到镜像:
- 从远程仓库下载
- 拷贝
- 自己制作一个镜像DockerFile
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次 提交来一次一次的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础,镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。2、UnionFS(联合文件系统)
特性:一次同时加载多个文件系统,但从外边来看,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS;3、Docker 镜像加载原理
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是加载引导kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内核的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在bootfs之上,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统的发行版,比如Ubuntu,Centos等等。
问题:安装在虚拟机中的Centos好几个G,为什么在Docker中才200M?
答:对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供bootfs即可。由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同发行版可以共用bootfs。
虚拟机是分钟级别的,容器是秒级的!!4、分层的理解
分层的镜像
下载一个镜像,观察下载的日志输出,下载过程是一层一层下载!
为什么Docker结构要采用分层的的结构?
最大的好处莫过于资源共享。 比如多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以用docker image inspect 命令!
[root@localhost ~]# docker image inspect centos[{"Id": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566","RepoTags": ["centos:latest"],"RepoDigests": ["centos@sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd"],"Parent": "","Comment": "","Created": "2020-08-10T18:19:49.837885498Z","Container": "3b04ecd9fb2d3f921f12d858edf5f3a6aa7c36c8e1e6f74bd32555fd4d7f7da2","ContainerConfig": {"Hostname": "3b04ecd9fb2d","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/sh","-c","#(nop) ","CMD [\"/bin/bash\"]"],"ArgsEscaped": true,"Image": "sha256:69587a438b2c9b803db8ed4f6e6b5abce25a6b8ec2583a394807cf82bfd23693","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20200809","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"DockerVersion": "18.09.7","Author": "","Config": {"Hostname": "","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"ArgsEscaped": true,"Image": "sha256:69587a438b2c9b803db8ed4f6e6b5abce25a6b8ec2583a394807cf82bfd23693","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20200809","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"Architecture": "amd64","Os": "linux","Size": 215102299,"VirtualSize": 215102299,"GraphDriver": {"Data": {"MergedDir": "/var/lib/docker/overlay2/e9bbc6fb9ee19bd026275f99652d4c44ccf8f08431994cfef119339bba8fad0f/merged","UpperDir": "/var/lib/docker/overlay2/e9bbc6fb9ee19bd026275f99652d4c44ccf8f08431994cfef119339bba8fad0f/diff","WorkDir": "/var/lib/docker/overlay2/e9bbc6fb9ee19bd026275f99652d4c44ccf8f08431994cfef119339bba8fad0f/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726"]},"Metadata": {"LastTagTime": "0001-01-01T00:00:00Z"}}]
理解:
所有的docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。
Commit镜像:
docker commit 提交容器成为一个新的副本
docker commit -m=’提交的描述信息’ -a=’作者’ 容器ID 目标镜像名实战测试
1、启动一个默认的tomcatdocker run -it -p 8008:8080 tomcat
2、发现这个tomcat没有webapps应用,镜像的原因,官方的镜像默认webapps下是没有文件的!
3、拷贝需要的基本文件root@f6b29b11d59e:/usr/local/tomcat# cp -r webapps.dist/* webapps
4、将我们操作过的容器通过commit提交为一个镜像。以后可以使用修改过的镜像![root@localhost ~]# docker commit -a="zhangjun" -m="add webapps app" f6b29b11d59e tomcat01:1.0
5、启动镜像docker run -it -p 8008:8080 tomcat01:1.0
如果想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像!类似VM中的快照。五、容器数据卷
防止容器删除,数据丢失,需要数据持久化!
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上。
总结:容器的持久化和同步操作!容器也是可以共享数据的!使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机内目录 容器目录实战:安装MYSQL 数据持久化
获取镜像 [root@localhost ~]# docker pull mysql

#运行容器,数据挂载 #安装MYSQL,配置密码
#官方测试:$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
启动mysql
-d后台运行
-p端口映射
-v卷挂载
-e环境配置
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
镜像备份
docker ps
[root@localhost opt]# docker save -o appsmith_redis.tar redis
[root@localhost opt]# docker save -o appsmith_certbot.tar certbot/certbot
[root@localhost opt]# docker save -o appsmith_mongo.tar mongo
[root@localhost opt]# docker save -o appsmith_contain.tar containrrr/watchtower
镜像加载
docker load -i mycentos.tar
