0%

docker使用

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下载对比

官网下载

1
2
3
4
5
6
7
8
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

1
2
apt-cache madison docker-ce #显示版本吧
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

阿里云下载 :单应用 国内源下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 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

1
2
3
4
#/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 ,可以查看到我们的镜像加速网站

阿里云官网给出的是,新版本安装.

1
2
3
4
5
6
7
8
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,自己写入

1
2
3
{
"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

image-20210903141031162

算了,在wsl就严格按照wsl的规则来.就图一乐.

测试

1
2
docker run hello-world
#人家运行完了会停止.

重启docker或者启动docker

1
2
service docker restart
#这个命令就相当于重启win,但是他很快.

快速的原理

docker有更少的抽象层,不需要硬件资源虚拟化,只用自己的大鲸鱼操作系统.

帮助命令

1
2
3
docker info
docker command --help
man docker command

镜像命令

大海–win10

鲸鱼–docker

集装箱–容器实例 ;这个来自镜像

命令更新了很多,自己man command

1
2
3
4
5
6
7
8
9
10
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,又可以形成一个新的镜像.

1
docker commit -m="提交描述信息" -a="作者" 容器ID 要创建的目标镜像名:标签名
1
2
3
4
5
6
#作者删除了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中,把文件复制过去就好了.

容器命令

运行centos

1
2
3
4
5
6
7
8
9
10
11
docker 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是删除容器记录
1
2
docker run -d centos#后台启动,但是ps命令查不出来
docker logs -f -t --tail 容器id#t 时间戳;f 追加最新日志打印; tail 数字 显示后几条

docker容器后台运行,必须有一个前台进程;如果不挂起,就会自动退出,自杀.

1
2
3
4
5
6
7
8
9
10
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一样了

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这些东西

image-20210904105030362

联合文件系统的好处:共享资源. 比如,多个镜像从相同的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学习-补充

参考文献

[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博客

整理程序,不要注释

1
2
3
4
5
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"
1
2
3
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

算了,还是按照阿里云镜像网址上来吧

命令

镜像

容器数据卷

dockerfile

docker网络原理

IDEA整合docker

集群 docker compose

docker swarm(简化版的k8s)

CI\CD jenkins