Abstract:那时候为了搭建gitea而学习docker,好像以前看的一篇论文中别人就是把自己的程序放在docker,便于隔离运行,更容易复现.现在看来那时候没掌握学习的方法.国内学习这些需要国外服务器的东西不免镜像设置和代理设置.总之,我现在整理的时候也不想看,我就想直接有个项目使用docker,以项目学习技术知识.
Keywords:docker学习 ,如何使用docker
参考文献
[1] 尚硅谷Docker快速入门基础篇-周阳主讲_哔哩哔哩_bilibili
docker基础
docker概念
学到一个说法,mysql一个容器,ngix一个容器,我把者两个容器放在鲸鱼背上就可以执行了.
镜像是文件,容器是进程
docker镜像加速
mark一下
docker下载对比
官网下载
1 | sudo apt-get remove docker docker-engine docker.io containerd runc |
1 | apt-cache madison docker-ce #显示版本吧 |
阿里云下载 :单应用 国内源下载
1 | step 1: 安装必要的一些系统工具 |
发现其实mirrors.aliyun.com/docker-ce替换了download.docker.com.
我给他起名字叫单个应用的国内镜像下载
手动下载 :适合没有网络的,只有安装包
镜像加速 阿里云
尚硅谷是这样设置的,当然他的是centos,我的是ubuntu,我肯定转换成ubuntu
1 | /etc/default/docker |
然后重启docker后台服务: service docker restart
然后用ps -ef | grep docker ,可以查看到我们的镜像加速网站
阿里云官网给出的是,新版本安装.
1 | sudo mkdir -p /etc/docker |
或者我vim /etc/docker/daemon.json,自己写入
1 | { |
然后执行systemctl那两条命令
设置国内源,不用外国
启动docker
有点问题
修复 “System has not been booted with systemd as init system “的错误。 - A5互联 - 博客园 (cnblogs.com)
wsl是sysvinit系统,linux上是systemd系统.
wsl打开docker是 service docker start
算了,在wsl就严格按照wsl的规则来.就图一乐.
测试
1 | docker run hello-world |
重启docker或者启动docker
1 | service docker restart |
快速的原理
docker有更少的抽象层,不需要硬件资源虚拟化,只用自己的大鲸鱼操作系统.
帮助命令
1 | docker info |
镜像命令
大海–win10
鲸鱼–docker
集装箱–容器实例 ;这个来自镜像
命令更新了很多,自己man command
1 | dcoker images #查看镜像 |
repository:镜像仓库源
tag: 镜像的标签,版本;同一个仓库源有多个tag,使用repository:tag来定义不同的镜像
docker commit命令
我们在运行的容器上边做了自定义的修改.然后我们把当前的容器commit,又可以形成一个新的镜像.
1 | docker commit -m="提交描述信息" -a="作者" 容器ID 要创建的目标镜像名:标签名 |
1 | 作者删除了tomcat的webapps下的docs |
tomcat 404
tomcat启动需要webapp 中的root,但是新版本中的root在webapp.dist中,把文件复制过去就好了.
容器命令
运行centos
1 | docker run -it id#开启了centos了;i 交互;t 分配一个伪终端 |
1 | docker run -d centos#后台启动,但是ps命令查不出来 |
docker容器后台运行,必须有一个前台进程;如果不挂起,就会自动退出,自杀.
1 | docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done" #/bin/sh 是指以sh格式交互,但是默认是bash |
1 | docker run -it -P tomcat ls -l#默认在shell中执行,造成tomcat最后的cmd命令被覆盖,造成tomcat不启动 |
1 | docker cp 容器id:/tmp/yum.log /root#容器log copy到宿主主机 |
镜像原理
镜像就是千层饼.对文件系统的修改作为一次提交来一层层的叠加.
unionfs(联合文件系统):union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下.union文件系统是docker镜像的基础.镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像.
特性: 一次同时加载多个文件系统,但是从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录.
bootfs就类似linux的kernel,rootfs就是ubuntu或者centos
对于一个精简的os,rootfs可以很小,只需要包括最基本的命令,工具和程序库就可以了,因为底层直接用host的kernel,自己只需要提供rootfs就行了.由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别.因此不同的发行版空一公用bootfs
所有dockrer pull xxx的时候会发现好像是一层层下载,就是一层层加载文件.
所有的镜像好像是把软件运行的环境包括操作系统的rootfs都打包了.比如我们要用tomcat,那么需要linux kernel,centos,jdk8,tomcat这些东西
联合文件系统的好处:共享资源. 比如,多个镜像从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了.而且镜像的每一层都可以被共享.
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部.这一层通常被称作”容器层”,”容器层”之下的都叫”镜像层”
docker 容器数据卷
容器运行中产生的文件我想要长久保存,比如内存中的数据关了就没了,硬盘才靠谱.就像一个u盘. redis 分布式内存数据库.
特点是 1 数据卷可以在容器之间共享或重用数据 2 卷中的更改可以直接生效 3 数据卷中的更改不会包含在镜像的更新中 4 数据卷的生命周期一直持续到没有容器使用它为止
如何数据持久化呢?
1 | docker run -it -v /宿主机 绝对路径:/容器内目录 镜像名# volume卷#docker run -it -v /mydata : /data xxx#这样就在宿主主机自动有mydata,容器自动有datadocker inspect 容器id#可以查看Volumes,也可以查看HostConfig中的Bindsdocker run -it -v /宿主机 绝对路径:/容器内目录:ro 镜像名#容器内部只可读共享文件 |
这个概念我挺想在服务器和我的电脑上实现的,就可以数据共享了,不用通过pycharm每次上传文件了,就可以时时更新了.
dockerfile添加容器数据卷
做着做着就会了.
1 | hello.java 编译成 hello.classimages 相当于编译成 dockerfile |
示例dockerfile
1 | FROM centos #算是内核VOLUME ["/1","/2"]CMD echo "finished"CMD /bin/bash |
相当于
1 | docker run -it -v /host1:/1 -v /host2:/2 centos /bin/bash |
然后docker build 文件生成一个新镜像
1 | docker build -f /你的dockerfile -t liji/centos . #liji/centos是一个镜像名字;. 是在当前目录下 |
运行一下命令
1 | docker run -it liji/centos#注意我们没有指定宿主机 的共享文件,所以docker给我们的是默认的, |
小注意
如果以下之类的命令不成功,就试着改成如下的命令
1 | docker run -it -v /host1:/1 -v /host2:/2 centos /bin/bash#docker run -it -v /host1:/1 -v /host2:/2 --privileged=centos /bin/bash |
dockerfile使用
1 | 1 编写dockerfile2 docker build,获得自定义镜像3 docker run |
本源,源镜像:scratch
开头的指令是大写字母,且后边跟着一个参数.
每条指令都会创建一个新的镜像曾,并对镜像层进行提交
保留字指令
1 | FROM#基于那个镜像的MAINTAINER#作者姓名和邮箱RUN#容器构建时需要运行的linux命令EXPOSE#端口号WORKDIR#登录后的工作目录;没有指定就是根目录ENV#构建镜像过程中的环境变量;ENV path /usr WORKDIR $pathADD#拷贝,解压COPY#VOLUME#数据容器卷CMD#和run相似;可多个cmd命令,但只有最后一个生效;cmd会被docker run之后的参数替换;就是被覆盖了最后一条命令;docker run -it -P tomcat ls -l 可能会覆盖启动的命令,造成tomcat不启动了ENTRYPOINT#不会被覆盖命令 ;把docker run之后的命令当参数传给ONBUILD# |
示例
1 | from centosenv mypath /tmpworkdir $mypathrun yum -y install vim #按需下载东西run yum -y install net-toolsexpose 80#端口cmd /bin/bash |
build一下
1 | docker build -t mycentos:1.3 .#.为当前路径下创建 |
列出镜像的变更历史
1 | docker history 镜像id |
docker网络
1 | 容器网卡成对;veth-pari;docker0担任路由器docker exec -it tomcat02 ping (tomcat01) |
link技术
1 | docker run -d -P --name tomcat03 --link tomcat#docker exec -it tomcat02 ping tomcat01 不行#docker exec -it tomcat03 ping tomcat 02 行,反向不行. |
1 | docker network --helpdocker network lsdocker network inspect bridge的iddocker inspect 容器的id |
网络联通的操作及自定义网络
1 | docker network --helpdocker network ls#查看所有的docker网络#以前都是默认的--net bridgedocker run -d -P --name tomcat01 --net bridge tomcat |
1 | docker network create --driver bridge --subnet 192.168.0.0/16 --gatway 192.168.0.1 mynetdocker network inspect mynetdocker run -d -P --name tomcat-net-01 --net mynet tomcatdocker run -d -P --name tomcat-net-02 --net mynet tomcatdocker exec -it tomcat-net-01 ping 192.168.0.3#行docker exec -it tomcat-net-01 ping 192.168.0.3#行 |
网络模式:
bridge:桥接模式,就是交换机.
host:宿主机模式
联通阿里网络
1 | docker network connect --helpdocker network connect mynet tomcat01docker network inspect mynet#一个容器两个ip,就是公网ip,私网iipdocker ex |
docker小总结
总体步骤
搜索镜像,拉去镜像,查看镜像,启动镜像,停止镜像,移除镜像
mysql
1 | docker run -p 12345:3306 --name mysql-v /zz/mysql/conf:/etc/mysql/conf.d-v /zz/mysql/logs:/logs-v /zz/mysql/data:/var/lib/mysql-e MYSQL_ROOT_PASSWORD=123456-d mysql:5.6docker exec -it mysql的id /bin/bashmysql> mysql -uroot -p#数据备份docker exec id sh -c 'exec mysqldump --all-databases -uroot -p"123456"' > /zz/all-databases.sql |
redis
1 | docker run -p 6379:6379-v /zz/myredis/data:/data-v /zz/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf-d redis:3.2 redis-server /usr/local/etc/redis/redis.conf--appendony yes #持久化 |
修改配置文件
1 | vim /zz/myredis/conf/redis.conf/redis.conf |
连接redis
1 | docker exec -it redis的id redis-cli> SHUTDOWN 退出#东西放在data文件里了. |
docker学习-补充
参考文献
docker模型
container 容器,当成集装箱吧
image 映像,当成物品,运行环境和库等东西
镜像 容器: run commit
镜像 tar文件: save load
镜像 dockerfile: build
镜像 仓库: push pull
docker狂神
docker学习
按照官网的doc来,看来ubuntu 和centos安装有很大的不一样.
安装
docker官网
Empowering App Development for Developers | Docker
docker文档
Docker Documentation | Docker Documentation
dockerhub
镜像(image):
docker镜像,一个模板,通过模板创建容器,tomcat镜像->run->tomcat01容器,通过这个镜像可以创建多个容器,项目运行是在容器中的
容器(container):
通过镜像创立,基本命令:启动,停止,删除.
把容器理解成最简易的linux系统
仓库(repository):
和github一样,存放镜像的地方,阿里云也有容器服务,我们通过阿里云配置镜像加速.
环境准备
这个人把官网翻译下来,并且用了阿里云镜像,我就为了学习ubuntu下载docker如何使用阿里云镜像.
整理程序,不要注释
1 | sudo apt-get remove docker docker-engine docker.io containerd runc |
1 | echo \ |
算了,还是按照阿里云镜像网址上来吧
命令
镜像
容器数据卷
dockerfile
docker网络原理
IDEA整合docker
集群 docker compose
docker swarm(简化版的k8s)
CI\CD jenkins