Abstract:那时候为了搭建gitea而学习docker,好像以前看的一篇论文中别人就是把自己的程序放在docker,便于隔离运行,更容易复现.现在看来那时候没掌握学习的方法.国内学习这些需要国外服务器的东西不免镜像设置和代理设置.总之,我现在整理的时候也不想看,我就想直接有个项目使用docker,以项目学习技术知识.
Keywords:docker学习 ,如何使用docker
参考文献[1] 尚硅谷Docker快速入门基础篇-周阳主讲_哔哩哔哩_bilibili
Docker速通教程(全平台可参考)——司波图 UNRAID 陪玩教程 02_哔哩哔哩_bilibili
Ubuntu安装docker教程并配置阿里云镜像加速_危机!的博客-CSDN博客
docker基础 docker概念
学到一个说法,mysql一个容器,ngix一个容器,我把者两个容器放在鲸鱼背上就可以执行了.
docker镜像加速镜像是文件,容器是进程
mark一下
docker下载对比 官网下载sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
apt-cache madison docker-ce #显示版本吧 sudo apt-get install docker-ce=阿里云下载 :单应用 国内源下载docker-ce-cli= containerd.io
# step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安装GPG证书 curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 写入软件源信息 sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新并安装Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce # 安装指定版本的Docker-CE: # Step 1: 查找Docker-CE的版本: # apt-cache madison docker-ce # docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages # docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages # Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial) # sudo apt-get -y install docker-ce=[VERSION]
发现其实mirrors.aliyun.com/docker-ce替换了download.docker.com.
我给他起名字叫单个应用的国内镜像下载
手动下载 :适合没有网络的,只有安装包 镜像加速 阿里云尚硅谷是这样设置的,当然他的是centos,我的是ubuntu,我肯定转换成ubuntu
#/etc/default/docker other_args="--registry-mirror=https://uioxz5c8.mirror.aliyuncs.com" DOCKER_CERT_PATH=/ect/docker DOCKER_NOWARN_KERNEL_VERSION=1
然后重启docker后台服务: service docker restart
然后用ps -ef | grep docker ,可以查看到我们的镜像加速网站
阿里云官网给出的是,新版本安装.
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uioxz5c8.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
或者我vim /etc/docker/daemon.json,自己写入
{
"registry-mirrors": ["https://uioxz5c8.mirror.aliyuncs.com"]
}
然后执行systemctl那两条命令
设置国内源,不用外国 启动docker有点问题
修复 "System has not been booted with systemd as init system "的错误。 - A5互联 - 博客园 (cnblogs.com)
wsl是sysvinit系统,linux上是systemd系统.
wsl打开docker是 service docker start
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LVK4SpCZ-1635934553510)(docker/image-20210903141031162.png)]
算了,在wsl就严格按照wsl的规则来.就图一乐.
测试
docker run hello-world #人家运行完了会停止.重启docker或者启动docker
service docker restart #这个命令就相当于重启win,但是他很快.快速的原理
docker有更少的抽象层,不需要硬件资源虚拟化,只用自己的大鲸鱼操作系统.
帮助命令docker info docker command --help man docker command镜像命令
大海–win10
鲸鱼–docker
集装箱–容器实例 ;这个来自镜像
命令更新了很多,自己man command
dcoker images #查看镜像 docker run images # 有镜像就生成容器 docker search tomcat # 查找 docker pull tomcat #拉下来 docker rmi hello-world#自动删除latest,运行的时候不能删除 docker rmi -f hello-world # 强制删除,如果运行着,就会删除两层 docker rmi -f hello-world nginx# 删除多个 docker rmi -f $(docker images -qa) #批量删除 docker run [op] image [com] #运行,变实例. docker run -it -p 主机端口:docker容器端口 镜像 #如果-P就是随机分配端口.
repository:镜像仓库源
tag: 镜像的标签,版本;同一个仓库源有多个tag,使用repository:tag来定义不同的镜像
docker commit命令我们在运行的容器上边做了自定义的修改.然后我们把当前的容器commit,又可以形成一个新的镜像.
docker commit -m="提交描述信息" -a="作者" 容器ID 要创建的目标镜像名:标签名
#作者删除了tomcat的webapps下的docs docker commit -a="dd" -m="xxx" atguigu/id tomcat:1.2 docker rm -f $(docker ps -q)#删除 docker run -it atguigu/mytomcat:1.2 #以前是通过镜像生成实例,现在是通过实例生成新镜像,像java的反射. doker run -d -P tomcat# 此时后台运行tomcat 404
tomcat启动需要webapp 中的root,但是新版本中的root在webapp.dist中,把文件复制过去就好了.
容器命令 运行centosdocker run -it id#开启了centos了;i 交互;t 分配一个伪终端 docker ps #docker 进程 docker ps #l 上一个容器;a 当前加过往的容器;-n 3 上三次运行的容器;q 只显示容器id; exit#退出并停止,和c+p+q不同 docker run -it --name mycentos centos#改名字 ctrl+p+q#跳到宿主机,不停止 docker start 容器id#把以前关的容器再打开 docker restart 容器id #容器重启 docker stop 容器id #正常关机 docker kill 容器id #强制关机 docker rm 容器id #不带i是删除容器记录
docker run -d centos#后台启动,但是ps命令查不出来 docker logs -f -t --tail 容器id#t 时间戳;f 追加最新日志打印; tail 数字 显示后几条
docker容器后台运行,必须有一个前台进程;如果不挂起,就会自动退出,自杀.
docker run -d centos /bin/sh -c "while true;do echo hello zzyy;sleep 2;done" #/bin/sh 是指以sh格式交互,但是默认是bash docker run -it -P tomcat ls -l#默认在shell中执行 docker logs 容器id #发现跑着呢 docker logs -t -f --tail3 容器id#意思是带着时间戳,动态最新日志,只看最后三条. docker top 容器id #因为容器就是简易版的linux环境,其实有很多命令和linux相似,这个就是看这个容器的内部top docker inspect 容器id#查看容器内部细节,json串 docker attach 容器id#进入正运行的容器 docker exec -it 容器id ls -l /tmp#界面不进入,但是拿到了结果 docker exec -it 容器id /bin/bash #可以打开界面了,和attach一样了
docker run -it -P tomcat ls -l#默认在shell中执行,造成tomcat最后的cmd命令被覆盖,造成tomcat不启动
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这些东西
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddXz8I2Z-1635934553512)(docker/image-20210904105030362.png)]
联合文件系统的好处:共享资源. 比如,多个镜像从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需加载一份base镜像,就可以为所有容器服务了.而且镜像的每一层都可以被共享.
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部.这一层通常被称作"容器层",“容器层"之下的都叫"镜像层”
docker 容器数据卷容器运行中产生的文件我想要长久保存,比如内存中的数据关了就没了,硬盘才靠谱.就像一个u盘. redis 分布式内存数据库.
特点是 1 数据卷可以在容器之间共享或重用数据 2 卷中的更改可以直接生效 3 数据卷中的更改不会包含在镜像的更新中 4 数据卷的生命周期一直持续到没有容器使用它为止
如何数据持久化呢?
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添加容器数据卷做着做着就会了.
hello.java 编译成 hello.classimages 相当于编译成 dockerfile
示例dockerfile
FROM centos #算是内核VOLUME ["/1","/2"]CMD echo "finished"CMD /bin/bash
相当于
docker run -it -v /host1:/1 -v /host2:/2 centos /bin/bash
然后docker build 文件生成一个新镜像
docker build -f /你的dockerfile -t liji/centos . #liji/centos是一个镜像名字;. 是在当前目录下
运行一下命令
docker run -it liji/centos#注意我们没有指定宿主机 的共享文件,所以docker给我们的是默认的,
小注意
如果以下之类的命令不成功,就试着改成如下的命令
docker run -it -v /host1:/1 -v /host2:/2 centos /bin/bash#docker run -it -v /host1:/1 -v /host2:/2 --privileged=centos /bin/bashdockerfile使用
1 编写dockerfile2 docker build,获得自定义镜像3 docker run
本源,源镜像:scratch
开头的指令是大写字母,且后边跟着一个参数.
每条指令都会创建一个新的镜像曾,并对镜像层进行提交
保留字指令
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#
示例
from centosenv mypath /tmpworkdir $mypathrun yum -y install vim #按需下载东西run yum -y install net-toolsexpose 80#端口cmd /bin/bash
build一下
docker build -t mycentos:1.3 .#.为当前路径下创建列出镜像的变更历史
docker history 镜像iddocker网络
#容器网卡成对;veth-pari;docker0担任路由器docker exec -it tomcat02 ping (tomcat01)
link技术
docker run -d -P --name tomcat03 --link tomcat#docker exec -it tomcat02 ping tomcat01 不行#docker exec -it tomcat03 ping tomcat 02 行,反向不行.
docker network --helpdocker network lsdocker network inspect bridge的iddocker inspect 容器的id
网络联通的操作及自定义网络
docker network --helpdocker network ls#查看所有的docker网络#以前都是默认的--net bridgedocker run -d -P --name tomcat01 --net bridge tomcat
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:宿主机模式
联通阿里网络
docker network connect --helpdocker network connect mynet tomcat01docker network inspect mynet#一个容器两个ip,就是公网ip,私网iipdocker exdocker小总结 总体步骤
搜索镜像,拉去镜像,查看镜像,启动镜像,停止镜像,移除镜像
mysql
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
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 #持久化
修改配置文件
vim /zz/myredis/conf/redis.conf/redis.conf
连接redis
docker exec -it redis的id redis-cli> SHUTDOWN 退出#东西放在data文件里了.docker学习-补充 参考文献
[1] Docker速通教程(全平台可参考)——司波图 UNRAID 陪玩教程 02_哔哩哔哩_bilibili
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
Docker Hub
镜像(image):
docker镜像,一个模板,通过模板创建容器,tomcat镜像->run->tomcat01容器,通过这个镜像可以创建多个容器,项目运行是在容器中的
容器(container):
通过镜像创立,基本命令:启动,停止,删除.
把容器理解成最简易的linux系统
仓库(repository):
和github一样,存放镜像的地方,阿里云也有容器服务,我们通过阿里云配置镜像加速.
环境准备这个人把官网翻译下来,并且用了阿里云镜像,我就为了学习ubuntu下载docker如何使用阿里云镜像.
Ubuntu安装docker教程并配置阿里云镜像加速_危机!的博客-CSDN博客
整理程序,不要注释
sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get update curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
算了,还是按照阿里云镜像网址上来吧
欢迎留言讨论,爱你哦



