Docker学习笔记
Docker安装
Hello-world流程
开始->Docker会在本机寻找镜像->判断本机是否有这个镜像->使用这个镜像运行
底层原理
Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!
DockerServer接收到Docker-Client的指令,就会执行这个命令
Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- Docker利用的是宿主机的内核,vm需要的是Gue
所以说,新建一个容器时,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的;而docker是利用宿主机的操作系统,秒级
Docker的常用命令
帮助命令
docker version #显示docker版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #万能命令
镜像命令
docker images
[root@lehends ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 6 months ago 13.3kB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a, --all #列出所有镜像
-q, --quiet #只显示镜像的id
docker search 搜索镜像
[root@lehends ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 11419 [OK]
mariadb MariaDB Server is a high performing open sou… 4339 [OK]
#可选项,通过收藏过滤
--filter=STARS=3000#搜索出来的镜像就是stars大于3000的
docker pull 下载镜像
#下载镜像 docker pull 镜像名[:tag]
[root@lehends ~]# docker pull mysql
Using default tag: latest #如果不屑tag,默认latest
latest: Pulling from library/mysql
a330b6cecb98: Pull complete #分层下载,docker image的核心联合文件系统
9c8f656c32b8: Pull complete
88e473c3f553: Pull complete
062463ea5d2f: Pull complete
daf7e3bdf4b6: Pull complete
1839c0b7aac9: Pull complete
cf0a0cfee6d0: Pull complete
1b42041bb11e: Pull complete
10459d86c7e6: Pull complete
b7199599d5f9: Pull complete
1d6f51e17d45: Pull complete
50e0789bacad: Pull complete
Digest: sha256:99e0989e7e3797cfbdb8d51a19d32c8d286dd8862794d01a547651a896bcf00c
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
docker rmi 删除镜像
[root@lehends ~]# docker rmi -f 镜像id #删除指定的镜像
[root@lehends ~]# docker rmi -f 镜像id 镜像id 镜像id #删除多个镜像
[root@lehends ~]# docker rmi -f $(docker images -aq) #删除全部镜像
容器命令
我们有了镜像才可以创建容器,下载一个centos来学习
docker pull centos
新建容器并启动
docker run [可选参数] image
#参数说明
——name="Name" 容器名字 tomcat01 tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
-P 指定随机端口
#测试,启动并进入容器
[root@lehends ~]# docker run -it centos /bin/bash
[root@e5d2d390545e /]# ls # 查看容器内的centos,基础版本
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器中退回主机
[root@e5d2d390545e /]# exit
exit
[root@lehends ~]#
列出所有运行的容器
#docker ps 命令
-a #列出当前正在运行的容器+带出历史运行过的容器
-n=? #显示最近创建的容器
[root@lehends ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@lehends ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e5d2d390545e centos "/bin/bash" 3 minutes ago Exited (0) About a minute ago zealous_sutherland
42c8a5cde138 hello-world "/hello" 4 hours ago Exited (0) 4 hours ago happy_mayer
daa4235e6155 hello-world "/hello" 4 hours ago Exited (0) 4 hours ago magical_grothendieck
9e0949bb3e0c hello-world "/hello" 16 hours ago Exited (0) 16 hours ago blissful_jones
退出容器
exit # 直接容器退出并停止
Ctrl + p + Q # 容器退出不停止
删除容器
docker rm 容器id #删除指定容器,不能删除正在运行的容器,如果要强制删除 rm-f
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
其他的常用命令
后台启动容器
#命令 docker docker run -d 镜像名!
[root@lehends ~]# docker run -d centos
#问题docker ps,发现 centos 停止了
#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立即停止
查看日志命令
docker logs -f -t --tail #容器没有日志
#自己编写一段shell脚本
[root@lehends ~]# docker run -d centos /bin/bash -c "while true;do echokuangshen;sleep 1;done"
38ea0b45d533ff83ef7d58d2541211b02906b5be382ee6f9b66d66417403603c
[root@lehends ~]# docker ps
CONTAINER ID IMAGE
38ea0b45d533 centos
#显示日志
-tf #显示日志
-tail number #显示日志条数
[root@lehends ~]# docker logs -tf --tail 10 38ea0b45d533
查看容器中的进程信息
# 命令 docker top 容器id
[root@lehends ~]# docker top 38ea0b45d533
UID PID PPID C STIME TTY
root 24384 24347 0 19:38 ? root 24954 24384 0 19:42 ?
查看容器的元数据
docker inspect id
进入当前正在运行的容器
# 方式一
docker exec -it 容器id bashShell
[root@lehends ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38ea0b45d533 centos "/bin/bash -c 'while…" 26 minutes ago Up 26 minutes practical_thompson
[root@lehends ~]# docker exec -it 38ea0b45d533 /bin/bash
[root@38ea0b45d533 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:38 ? 00:00:00 /bin/bash -c while true;do echokuangshen;sleep 1;done
root 3169 0 0 12:04 pts/0 00:00:00 /bin/bash
root 3248 1 0 12:05 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 3249 3169 0 12:05 pts/0 00:00:00 ps -ef
# 方式二
docker attach 容器id
# docker exec 开启一个新的终端,可以在里面操作
# docker attach 进入容器正在执行的终端,不会启动新进程
从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
Docker镜像
镜像是什么
镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码,运行时,库,环境变量和配置文件
所有的应用,直接打包部署
Docker镜像加载原理
UnionFS(联合文件系统)
我们下载时看到的一层层的就是这个!
UnionFS(联合文件系统):Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。
commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m=“提交的描述信息” -a="作者" 容器id 目标镜像名:[TAG]
容器数据卷
什么是容器数据卷
docker的理念回顾
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
MySQL,容器删了,删库跑路!需求:MySQL数据可以存储在本地
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结:容器的持久化和同步操作!容器间可以数据共享的
使用数据卷
方式一:使用命令挂载 -v
docker run -it -v 主机目录:容器内目录(映射)
#测试
[root@lehends home]# docker run -it -v /home/test2:/home centos /bin/bash
#启动起来时,我们可以通过docker inspect 容器id
实际上就是一个双向绑定
安装mysql
#启动mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 名字
docker run -d -p 主机端口:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=密码 --name mysql01 mysql
#服务器的3310和容器内的3306连上了
假设我们将容器删除
我们挂载到本地的数据卷仍然没有消失,这就实现了容器数据持久化功能
具名和匿名挂载
#匿名挂载
-v 容器内路径
#查看所有的volume的情况
[root@lehends data]# docker volume ls
#具名挂载
[root@lehends data]# docker run -d -P --name nginx03 -vjuming-nginx:/etc/nginx nginx
09c48f69d543578d0507f3fc910670ad5521b0f35ccdd51d963f7cd5b5845d64
[root@lehends data]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
#通过 -v 卷名:容器内路径
所有docker卷都默认在/var/lib/docker
通过具名挂载可以方便的找到卷,所以大多数情况都用具名挂载
扩展:
docker run -d -P --name nginx03 -vjuming-nginx:/etc/nginx:ro nginx 只读
docker run -d -P --name nginx03 -vjuming-nginx:/etc/nginx:rw nginx 可读写
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层层的,脚本一个个的命令,每个命令都是一层!
#床架你一个dockerfile文件
#文件中的内容 指令(大写) 参数
FROM centos
VOLUME["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
#这里的每个命令就是镜像的一层
启动自己写的容器
这个卷和外部一定有一个同步的目录
查看一下卷挂载的路径
数据卷容器
共享数据
#启动两个容器挂载
[root@lehends docker-test-volume]# docker run -it --name docker02 --volumes-from docker01 lehends/centos:1.0
Dockerfile
是用来构建docker镜像的文件!命令参数文件!
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker run 发布镜像(DockerHub,阿里云镜像仓库)
Docker镜像组件成为企业交付的标准,必须要掌握
步骤:开发,部署,运维。。缺一不可!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供服务器
DockerFile的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像的作者,姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #步骤:tomcat镜像,这个tomcat压缩包!添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOST #保留端口配置
CMD #指定这个容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动时要运行的命令,可以追加命令
ONBUILD #当构建一个被继承 DockerFile 这个时候就会出发命令
COPY #类似ADD,将我们文件拷贝到镜像中
ENV #构建的时候设置环境变量!
构建自己的centos
Docker Hub中99%镜像都是从这个基础镜像过来的 FROM scratch,然后配置需要的软件和配置来进行构建
#编写Dockerfile文件
FROM centos
MAINTAINER lehends<yzh2316@sina.com
ENV MYPATH /usr/local
WORKDIR $YPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#通过这个命令构建镜像
#命令 docker build -f dockerfile文件路径 -t 镜像名:[tag]