Docker入门
苑一峰教程:https://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
菜鸟教程:https://www.runoob.com/docker/docker-architecture.html
狂神视频:https://www.bilibili.com/video/BV1og4y1q7M4
狂神笔记:https://blog.csdn.net/qq_21197507/article/details/115071715
笔记资料:https://blog.csdn.net/huangjhai/article/details/118854733
Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。
Linux 容器
由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。
**Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。**或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
由于容器是进程级别的,相比虚拟机有很多优势。
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
(2)资源占用少
容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。
总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。
作者:网易数帆
链接:https://www.zhihu.com/question/27561972/answer/230398763
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Docker 技术的三大核心概念,分别是:
Images(镜像):是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像。这是一个种很通俗的说法,也很容易理解。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LuG01O3u-1659336565666)(docker%E5%85%A5%E9%97%A8.assets/v2-820aee2a33654099d87cdd2b7a1ce741_720w.jpg)]
从中可以看出,Docker 包含三个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心。
回到正题,Docker 镜像可以看作是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
要想更深入的了解 Docker 镜像,镜像的原理也必不可少,而这其中最重要的概念就是镜像层(Layers)(如下图)。镜像层依赖于一系列的底层技术,比如文件系统(filesystems)、写时复制(copy-on-write)、联合挂载(union mounts)等,幸运的是你可以在很多地方学习到这些技术,这里就不再赘述技术细节。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cC5eX2ND-1659336565667)(docker%E5%85%A5%E9%97%A8.assets/v2-d5c06c456761b5a27090e3328b1f6882_720w.jpg)]
总的来说,你最需要记住这点:
在 Dockerfile 中, 每一条指令都会创建一个镜像层,继而会增加整体镜像的大小。
镜像作为 Docker 最突出的创新之一,它变革了软件交付标准。理解镜像,对理解整个 Docker 的生命周期非常重要。
注:对镜像应用感兴趣的同学,还可以看看这几期的《玩转 Docker 镜像》系列,图文结合视频,可以帮助更好的理解 Docker 镜像。
当我对Docker技术还是一知半解的时候,我发现理解Docker的命令非常困难。于是,我花了几周的时间来学习Docker的工作原理,更确 切地说,是关于Docker统一文件系统(the union file system)的知识,然后回过头来再看Docker的命令,一切变得顺理成章,简单极了。
先看一下这个图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXLVaosU-1659336565668)(docker%E5%85%A5%E9%97%A8.assets/v2-94d03fb07333ba5c899ab64647895a93_1440w.jpg)]
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5tS4q93Z-1659336565668)(docker%E5%85%A5%E9%97%A8.assets/v2-70a7444d93e801340a202d8d57543c79_720w.jpg)]![img](docker%E5%85%A5%E9%97%A8.a
细心的读者可能会发现,容器的定义并没有提及容器是否在运行,没错,这是故意的。正是这个发现帮助我理解了很多困惑。
要点:容器 = 镜像 + 可读层。并且容器的定义并没有提及是否要运行容器。
来源:容器和镜像的区别
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
架构图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Ot8hCrb-1659336565669)(docker%E5%85%A5%E9%97%A8.assets/image-20220519203144245.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RVy7Sc2q-1659336565669)(docker%E5%85%A5%E9%97%A8.assets/20200411132109992.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0J0QdQ5z-1659336565669)(docker%E5%85%A5%E9%97%A8.assets/20200411132454634.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3DUynaJB-1659336565669)(docker%E5%85%A5%E9%97%A8.assets/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZhbmppYW5oYWk=,size_16,color_FFFFFF,t_70.png)]
DevOps
DevOps是短期开发周期内高质量软件的首选方法,提高客户满意度。
顶级互联网公司选择DevOps作为业务目标的前进方向。
DevOps(Development和Operations的组合词)是一种“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。通过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D9m5OeUU-1659336565670)(docker%E5%85%A5%E9%97%A8.assets/image-20220518195343261.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sP986Fmq-1659336565670)(docker%E5%85%A5%E9%97%A8.assets/image-20220518195412182.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Dlfv7UA-1659336565670)(docker%E5%85%A5%E9%97%A8.assets/image-20220518195538496.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RoRcWad-1659336565671)(docker%E5%85%A5%E9%97%A8.assets/image-20220518195620381.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uBM21S9E-1659336565671)(docker%E5%85%A5%E9%97%A8.assets/image-20220518195705963.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O0XF3zYi-1659336565672)(docker%E5%85%A5%E9%97%A8.assets/image-20220518195838895.png)]
Docker常用命令
防火墙管理
1、firewalld的基本使用
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
————————————————
版权声明:本文为CSDN博主「yymagicer_yy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_26476047/article/details/116192448
docker启动
#启动引擎
sudo systemctl start docker
sudo systemctl restart docker
# 设置开机自动启动
systemctl enable docker
exit 退出容器
docker search 某个镜像的名称 # 搜索镜像,例如:docker docker search mysql
docker version # 显示Docker版本信息
docker info # 显示Docker系统信息,包括镜像数、容器数、正在运行的镜像数、暂停的镜像数、停止的镜像数等
docker --help # 显示docker指令的信息
docker 指令 --help # 显示具体某一个docker指令的可选项
docker容器
docker run [OPTIONS] 镜像名 [COMMAND][ARGS...]
# 常用可选参数以及解释
--name # 给容器取一个名字
--rm # 容器退出后,自动删除容器
-i # 以交互模式运行容器,通常与-t同时使用,即-it
-t # 分配一个虚拟的终端,在docker中启动bash就会有提示符,通常与-i通知使用,即-it
-d # 在后台运行容器。等同于进入容器后按Ctrl+P+Q。所以可以docker attach回去。在后台运行的容器,只能通过网络和它交互。
-p # 设置端口转发。-p:hostport:containerport
使用centos进行交互模式 -it 启动容器,在容器内执行/bin/bash命令;末尾加此命令
使用centos进行守护模式 -id 启动容器,则不可加/bin/bash;
docker run -i -t ubuntu:15.10 /bin/bash
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
我们可以通过运行 exit 命令或者使用 CTRL+D 来退出容器。
docker ps [OPTIONS] #列出所有运行的容器
-a # 列出所有正在运行的容器 + 历史运行过的容器(docker ps -a)
-l # 列出最近创建的一个容器以及该容器的信息
-n int # 列出最近n个创建的容器以及容器的信息
-q # 列出容器的编号
-s # 列出容器的大小
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
-d (daemon)
#运行过的容器
docker ps
-a查看所有历史容器
#运行时容器状态
#询最后一次创建的容器
docker ps -l
docker stats
docker logs
#删前停止
docker stop <容器 ID>
docker restart <容器 ID>
exit # 容器停止并退出
Ctrl + P + Q # 容器不停止退出,也就是进入后台模式,等同于docker run的参数 -d
#重启容器
docker start (容器id or 容器名) # 启动容器
docker restart(容器id or 容器名) # 重启容器
docker stop (容器id or 容器名) # 停止容器
docker kill(容器id or 容器名) # 强制停止容器
#强删容器
docker rm -f 1e560fca3906
docker rm 容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器(常用)
docker ps -aq | xargs docker -rm # 删除所有容器(不常用)
#启动容器
docker start b750bbbcfd88
docker run -itd --name ubuntu-test ubuntu /bin/bash
-d docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式
#重新进入容器
docker attach 1e560fca3906
docker exec -it 243c32535da7 /bin/bash
-d # 让命令在后台执行
-e # 设置环境变量
-it # 使用交互模式进入
-u -w # 分别设置命令运行的用户和work directory。也就是如果要改变用户或者工作目录,就是用-u或-w
例 docker exec -it mysql /bin/bash
#导出容器
docker export 1e560fca3906 > ubuntu.tar
docker import http://example.com/exampleimage.tgz example/imagerepo
docker run -d -p 5000:5000 training/webapp python app.py
#追踪容器日志
docker logs -f bf08b7f2cd89
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
-t # 显示时间戳(docker logs -t)
--tail 数字 # 数字---显示多少条
#容器性能监控——查看容器中运行的进程信息
docker top wizardly_chandrasekhar
#查看容器 / 镜像的元数据
docker inspect wizardly_chandrasekhar
#从容器中copy数据到主机
docker cp 容器id:容器内路径 目的主机路径 #从容器内拷贝文件到=>主机上(docker cp)
例如:docker cp f261f17bb39d:/home/f1 /home
docker镜像
docker images
docker pull ubuntu:13.10
docker search httpd
#删除镜像
docker rmi hello-world
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名
docker rmi -f 镜像id # 删除单个镜像
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个
docker rmi -f $(docker images -qa) # 删除全部
#cat Dockerfile
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
docker build -t runoob/centos:6.7 .
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
docker tag 860c279d2fec runoob/centos:dev
docker连接
docker run -d -p 5000:5000 training/webapp python app.py
Docker连接
mysql5.7安装
https://blog.csdn.net/chenxuezhou/article/details/123999248
docker pull mysql:5.7
docker run -d -p 3306:3306
-v /home/mysql/log:/var/log/mysql
-v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456
--name mysql01
mysql:5.7
—name指定容器名字
-v目录挂载
-p指定端口映射
-e设置mysql参数
-d后台运行 挂载到外部 外部一修改 里面也会修改
-v 宿主机(外部地址): 虚拟机(内部地址,不存在文件夹的话会自动创建)
docker inspect xxxxx
#进入mysql容器
docker exec -it 容器名称|容器id bin/bash
#登录mysql,并打开远程访问授权
//1.登录mysql
mysql -uroot -p123456
//2.进行授权开发其他主机访问
GRANT ALL ON *.* TO 'root'@'%';
//3.刷新权限
flush privileges;
//4.加密规则
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
//5.更新root密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
//6.刷新权限
flush privileges;
#设置mysql随docker启动而启动
docker update --restart=always mysql01
#连接测试是否成功,记得开放云服务器安全组端口!!
mysql8安装
https://blog.csdn.net/qq_44818849/article/details/122288298
docker run --name mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql:/etc/mysql/conf.d -v /usr/local/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:8.0
安装tomcat
tomcat安装参考:https://blog.csdn.net/weixin_45351743/article/details/114131370
docker search tomcat #拉取tomcat镜像
docker pull tomcat:latest #拉取最新的tomcat
docker images #查看拉取的tomcat
docker run -d -p 8080:8080 --name tomcat tomcat:latest #创建tomcat容器
#从容器中拷贝tomcat的配置文件,并删除原镜像
mkdir -p /usr/app/tomcat
docker cp tomcat:/usr/local/tomcat/conf /usr/app/tomcat/conf #注意:方向是【容器内-》宿主主机】
docker cp tomcat:/usr/local/tomcat/logs /usr/app/tomcat/logs
docker stop tomcat
docker rm tomcat
#重新创建镜像并把配置文件添加进去(注意:这个-v后面的是【宿主主机:容器内目录】)
docker run -d -p 8080:8080 --name tomcat
-v /usr/app/tomcat/webapps:/usr/local/tomcat/webapps
-v /usr/app/tomcat/conf:/usr/local/tomcat/conf
-v /usr/app/tomcat/logs:/usr/local/tomcat/logs
--restart=always #这个表示docker服务启动后会自动启动该容器
tomcat:latest
docker ps | grep tomcat #查看创建的tomcat容器
docker inspect --format='{{.NetworkSettings.IPAddress}}' tomcat #查看容器的ip地址
#检查tomcat是否安装完成
#如果显示无法访问此网站,如果不显示检查防火墙是否开放8080端口或关闭防火墙
cd /usr/app/tomcat/webapps/
tar -zxvf ROOT.tar.gz #解压ROOT文件
docker start tomcat #重启tomcat
#测试成功
docker logs -f -t --tail 20 tomcat #看到这个tomcat的日志
tomcat和mysql安装:https://blog.csdn.net/EnlightenedNet/article/details/112979654
#拉取tomcat镜像
docker pull tomcat:7.0
#安装运行tomcat
docker run -di --name=my_tomcat -p 8888:8080
-v /data/tomcat/webapps:/usr/local/tomcat/webapps
-v /data/tomcat/logs/:/usr/local/tomcat/logs
tomcat:7.0
-------------------------
-di 后台守护方式运行
--name 设置容器名(不设置的话会随机生成)
-v 外部地址挂再容器内部地址(绝对路径),文件夹自动生成。
--------------------------
#进入tomcat容器内部
docker exec -it mysql /bin/bash
#更改内部文件
#进入到usr/local/tomcat文件夹下
mv usr/local/tomcat/webapps.best/* usr/local/tomcat/webapps
#退出容器
exit
安装nginx
https://blog.csdn.net/weixin_46244732/article/details/114315708
将nginx容器内部配置文件挂载到主机
docker run -d -p 80:80 nginx
docker exec -it 45f7bbd062ba /bin/bash
mkdir -p /docker-work/nginx/conf
mkdir -p /docker-work/nginx/html
mkdir -p /docker-work/nginx/logs
docker cp a70e8226d77a:/etc/nginx/nginx.conf /docker-work/nginx/ #nginx.conf是个文件
docker cp a70e8226d77a:/etc/nginx/conf.d/default.conf /docker-work/nginx/conf #default.conf是个文件
docker cp a70e8226d77a:/usr/share/nginx/html /docker-work/nginx #html是目录拷贝
docker cp a70e8226d77a:/var/log/nginx/access.log /docker-work/nginx/logs #access.log是文件
docker cp a70e8226d77a:/var/log/nginx/error.log /docker-work/nginx/logs #error.log是文件
注:docker cp dbc 中的 "e8839edc9997" 为容器ID前缀,只要唯一就好了
docker stop e8839edc9997
docker rm e8839edc9997
docker run --name nginx -m 200m -p 80:80 -v /docker-work/nginx/nginx.conf:/etc/nginx/nginx.conf -v /docker-work/nginx/logs:/var/log/nginx -v /docker-work/nginx/html:/usr/share/nginx/html -v /docker-work/nginx/conf:/etc/nginx/conf.d -e TZ=Asia/Shanghai --privileged=true -d nginx
参数说明
-name 给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器
-p 映射端口,将docker宿主机的80端口和容器的80端口进行绑定
-v 挂载文件用的,
-m 200m 分配内存空间
-e TZ=Asia/Shanghai 设置时区
第一个-v 表示将你本地的nginx.conf覆盖你要起启动的容器的nginx.conf文件,
第二个-v 表示将日志文件进行挂载,就是把nginx服务器的日志写到你docker宿主机的/home/docker-nginx/log/下面
第三个-v 表示的和第一个-v意思一样的。
-d 表示启动的是哪个镜像
安装Redis
https://blog.csdn.net/weixin_45821811/article/details/116211724
mkdir -p /home/redis/myredis
mkdir -p /home/redis/myredis/data
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name myredis
-v /home/redis/myredis/myredis.conf:/etc/redis/redis.conf
-v /home/redis/myredis/data:/data
-d redis
redis-server /etc/redis/redis.conf
--appendonly yes
--requirepass 000415
docker ps -a |grep myredis # 通过docker ps指令查看启动状态,是否成功.
docker logs --since 30m myredis
docker exec -it myredis redis-cli
auth 000415
config get requirepass
set k1 v1
get k1
测试连通性
https://blog.csdn.net/luoshao666/article/details/123280147
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PeRxoUpv-1659336565672)(docker%E5%85%A5%E9%97%A8.assets/image-20220801105808754.png)]