比较Docker和虚拟机技术的不同:
传统虚拟机,虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。
*
容器内的应用直接运行在宿主机的内容,容器是没有自已的内核的,也没有虚拟我们的硬件,所以就轻便了。
*
每个容器间是互相隔离,每个容器都有一个属于自已的文件系统,互不影响。
应用更快速的交付和部署
传统:一堆帮助文档,安装程序
*
Docker:打包镜像发布测试,一键运行
更便捷的升级和扩缩容
使用了Doker之后,我们的部署应用就和搭积木一样!
*
项目打包为一个镜像,扩展 服务器 A!服务器 B
更简单的系统运维
更高效的计算资源利用
镜像(image):
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
*
启动,停止,删除,基本命令!
*
目前就可以把这个容器理解为就是一个简易的linux系统
仓库(repository):
仓库就是存放镜像的地方!
*
仓库分为公有仓库和私有仓库!
*
Docker Hub(默认是国外的)
*
阿里云…都有容器服务器(配置镜像加速!)
本文中的所有命令都是 root 用户来操作的,若是其他用户记得加上 sudo
环境查看命令
uname -r
我们这里选用的系统内核应该是 3.10 以上的
系统版本命令
cat /etc/os-release
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
rm -rf /var/run/docker
yum install -y yum-utils
#阿里云镜像地址
yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce docker-ce-cli containerd.io
docker version
systemctl start docker
ps -ef|grep docker 用于查看进程
docker run hello-world
docker images
#1.卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2.删除资源
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
#/var/lib/docker 的默认工作路径
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://84pkycqd.mirror.aliyuncs.com"] } EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker有着比虚拟机更少的抽象层。
1.
Docker利用的是宿主机的内核,vm需要是Guest OS。
所以说,新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机是加载Guest OS,分钟级别的,而docker是利用 宿主机的操作系统,省略了这个复杂的过程,秒级!
docker 命令 --help
docker version
docker info
docker images
这些列都是什么意思呢?不急下面我们逐一说明。
这个命令还有两个常用可选项
-a
列出所有镜像
-q
值显示镜像的id
docker search 镜像名称
可选项,通过搜索来过滤
--filter=STARS=3000
搜索处理的镜像就是STARS (STARS相当于使用量) 大于3000docker pull 镜像名[:tag]
注意:tag是指定的版本,如果不写tag默认就是 latest(最新版)
这里说明一下,docker是分层下载镜像的后面将可以看到这样做的好处。
指定版本下载
这样看来分层的好处就显而易见了吧。docker会自动避免重复下载
docker rmi -f 镜像id
docker rmi -r 镜像id1 镜像id2 镜像id3
docker rmi -r $(docker images -aq)
删除时最好通过id来删除保证唯一。这里演示一个就可以了,大家下去自行尝试吧 ~
docker run [可选参数] 镜像名
参数说明
--name="Name"
容器名字 tomcat01 tomcat02 用来区分容器-d
后台方式运行-it
使用交互方式运行,进入容器内查看内容-p
指定容器的端口 -p 8080:8080exit
ctrl + p + q
docker ps
可选参数
-a
列出当前正在运行的容器+历史运行过的容器-n=1
显示最近创建的一个容器-q
只显示容器的编号可以看到现在没有在运行的容器,下面我们加上-a
参数查看一下历史运行过的容器。
docker rm 容器id
-f
参数即可docker rm -f 容器id
docker rm -f $(docker ps -aq)
这里只演示了,根据id号删除指定(hello world)容器!
docker run -d 容器名|容器id
注意:docekr ps 发现容器停止了
说明:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
docker logs -tf --tail 10 容器id
可选参数
-tf
显示日志--tail number
显示日志条数docker top 容器id
docker inspect 容器id
第一种
docker exec -it 容器id /bin/bash
第二种
docker attach 容器id
docker cp 容器id:容器内路径 目标的主机路径
docker的理念回顾。将应用和环境打包成一个镜像!
*
数据都在容器中,如果我们删除容器,数据就会丢失!需求:数据可以持久化,mysql数据可以存储在本地。
*
容器之间可以有一个数据共享技术,docker容器中产生的数据,同步到本地!
*
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到linux上面。
总结一句话:容器的持久化和同步操作,容器间也是可以数据共享的!
docker run -dit -v 主机目录:容器内目录
启动成功后可以使用docker inspect 容器id 命令查看详细信息
测试文件的同步,我们现在宿主机上创建test.java文件
然后我们进入容器内查看文件是否存在
再次测试,停止容器,在宿主机上修改文件,启动容器,容器内的数据依旧是同步的
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
docker run -d -P --name nginx01 -v /ect/nginx nginx
docker volume ls
这个就是匿名挂载,我们在 -v 后只写了容器内的路径,没有写容器外的路径!
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
查看所有的volume的情况
具名挂载,通过 -v 卷名:容器内路径
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用 具名挂载
如何确定是具名挂载还是匿名挂载,还是指定路径挂载?
-v 容器内路径
匿名挂载-v 卷名:容器内路径
具名挂载-v /宿主机路径:容器内路径
指定路径挂载通过 -v 容器内路径:ro rw 改变读写权限
ro(readonly)
只读,只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。rw(readwrite)
可读可写。一旦设置了容器权限,容器对我们挂载出来的内容就有了限定
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本!先体验一下!
*
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
我们来看一下官方是怎么做的
基础知识
dockerfile 是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!Docker镜像逐渐成为企业交付的标准,必须要掌握!
*
步骤:开发,部署,运维。。。缺一不可
*
DockerFile:构建文件,定义了一切的步骤,源代码
*
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
*
Docker容器:容器就是镜像运行起来提供服务的
指令 | 说明 |
---|---|
FROM | 基础镜像,一切从这里开始构建 |
MAINTAINER | 镜像是谁写的,姓名+邮箱 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 添加内容 |
WORKDIR | 镜像的工作目录 |
VOLUME | 挂载的目录 |
EXPOSE | 保留端口配置 |
CMD | 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 |
ENTRYPOINT | 指定这个容器启动的时候要运行的命令,可以追加命令 |
ONBUILD | 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令。触发指令。 |
COPY | 类似ADD,将我们文件拷贝到镜像中 |
ENV | 构建的时候设置环境变量! |
CMD 和 ENTRYPOINT 区别
CMD
指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代# 编写dockerfile 文件
[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# vim centostest
FROM centos
CMD ["ls","-a"]
# 构建镜像
[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker build -f centostest -t cmdtest .
# run运行,发现我们的ls -a命令生效
[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ccf40f4cce18
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# 想追加一个命令 -l ls -al
[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ccf40f4cce18 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
# cmd的情况下 -l 替换了CMD["ls","-a"]命令,-l 不是命令所以报错!
ENTRYPOINT
指定这个容器启动的时候要运行的命令,可以追加命令# 编写dockerfile 文件
[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# vim dockerfile-cmd-entory
FROM centos
ENTRYPOINT ["ls","-a"]
# 构建镜像
[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker build -f dockerfile-cmd-entory -t dockeren .
# 我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令的后面!
[root@iZ8vbjbtw24uc8kaw16kvsZ dockerfile]# docker run ffdaffe72ed2 -l
total 56
drwxr-xr-x 1 root root 4096 Mar 31 01:06 .
drwxr-xr-x 1 root root 4096 Mar 31 01:06 ..
-rwxr-xr-x 1 root root 0 Mar 31 01:06 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 340 Mar 31 01:06 dev
drwxr-xr-x 1 root root 4096 Mar 31 01:06 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media
drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt
drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt
dr-xr-xr-x 96 root root 0 Mar 31 01:06 proc
dr-xr-x--- 2 root root 4096 Dec 4 17:37 root
drwxr-xr-x 11 root root 4096 Dec 4 17:37 run
lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv
dr-xr-xr-x 13 root root 0 Mar 29 05:51 sys
drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp
drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr
drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
Dockerfile中很多命令都十分的相似,我们需要了解它们的区别,我们最好的学习就是对比他们然后进行测试效果!
创建一个自已的centos
FROM centos # 基础镜像
MAINTAINER yl<1903838739@qq.com> # 作者和邮箱
ENV MYPATH /usr/local # 设置环境变量
WORKDIR $MYPATH # 设置工作目录
#下载相关依赖,默认下载的centos镜像是不支持vim和ifconfig指令的,下载了这两个依赖就可以运行vim和ifconfig指令
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80 # 暴露端口
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash # 容器启动时进入/bin/bash目录
docker build -f dockerfile文件路径 -t 镜像名:[tag]
docker build -f mycentos -t mzccentos:0.1 .
.
不能省略。docker run -it mzccentos:0.1
到这我们自已手写的dockerfile就运行起来了。
docker history 容器id
官网:https://registry.hub.docker.com/
docker login -u用户名 回车后输入密码
命名规则 DockerHub用户名/镜像名:版本号
)注意:如果不修改后续push时可能会出现异常
docker push 镜像名
#登录阿里云
docker login --username=周周class registry.cn-zhangjiakou.aliyuncs.com
#修改镜像名
docker tag [ImageId] registry.cn-zhangjiakou.aliyuncs.com/mzcck/mzc-java:[镜像版本号]
#推送镜像到阿里云
docker push registry.cn-zhangjiakou.aliyuncs.co![请添加图片描述](http://img.saoniuhuo.com/images/202109/8751632808410818.jpg)
m/mzcck/mzc-java:[镜像版本号]
docker rmi -f $(docker images -q)
docker rm -f $(docker ps -aq)
docker pull mysql:5.7
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=123456 --name mysql mysql:5.7
参数解释:-d 后台运行 -p 端口映射 -v 挂载卷 -e 环境配置 --name 容器名称
docker pull redis
配置文件目录(在该目录下放置 redis.conf配置文件,目录可以自定义)
mkdir -p /home/redis/conf
数据目录
mkdir -p /home/redis/data
docker run -d --privileged=true -p 6379:6379 --restart always -v /home/redis/conf/redis.conf:/etc/redis/redis.conf -v /home/redis/data:/data --name myredis redis redis-server /etc/redis/redis.conf --appendonly yes
参数解释:
-d
以守护进程的方式启动容器--privileged=true
提升容器内权限-p 6379:6379
绑定宿主机端口--restart always
开机启动-v /home/redis/conf/redis.conf
映射配置文件-v /home/redis/data
映射数据目录--name myredis
指定容器名称--appendonly yes
开启数据持久化到此,我们的redis安装挂载也没问题了
docker pull nginx
日志目录
mkdir /home/nginx/log
配置文件目录
mkdir /home/nginx/conf
项目位置
mkdir /home/nginx/html
docker run --name mynginx -d -p 80:80 -v /home/nginx/log:/var/log/nginx -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/nginx/html:/usr/share/nginx/html nginx
注意:这里虽然启动成功了但是少挂载了 nginx.conf
配置文件,因为直接挂载会报错所以我们按照下方操作来
docker exec -it 容器id /bin/bash
cd /etc/nginx
,注意查看文件是否存在。exit
cd /home/nginx/conf
docker cp 容器id:/etc/nginx/nginx.conf .
docker rm -f 容器id
docker run --name mynginx -d -p 80:80 -v /home/nginx/log:/var/log/nginx -v /home/nginx/conf.d:/etc/nginx/conf.d -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/usr/share/nginx/html nginx
参数解释:
-d
以守护进程的方式启动容器--name myredis
指定容器名称-p 80:80
绑定宿主机端口到此我们 nginx挂载并运行已经完成了
docker pull tomcat
docker run --name tomcat -itd --privileged=true --rm -v /home/tomcat/webapp:/usr/local/tomcat/webapps/webapp -p 8080:8080 tomcat
参数说明:
--name tomcat
创建容器名称为tomcat--privileged=true
允许镜像挂载映射本地目录-p 8081:8080
端口映射-v
数据卷挂载-itd
以后台守护进程启动容器tomcat
tomcat镜像名我们访问测试发现报404
让我们进入容器中一探究竟
docker exec -it 容器id /bin/bash
进来后我们发现webapp下没有东西。阿里云镜像的原因。默认是最小的镜像,所有不必要的都剔除掉,保证最小可运行的环境。
cp -r webapps.dist/* webapps
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_45692705/article/details/120522001
内容来源于网络,如有侵权,请联系作者删除!