Docker初级教程笔记【来源--B站狂神说】

Docker安装

1、查看系统内核和系统信息

命令:
uname -r     #查看系统内核版本
cat /etc/os-release  #查看系统版本

2、开始安装Docker

2.1 卸载旧版本
命令:
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
2.2 下载依赖安装包
yum install -y yum-utils
2.3 配置镜像仓库
#国外的地址
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo  
    

#设置阿里云的Docker镜像仓库

yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.4 更新yum软件包
yum makecache fast
2.5 下载docker
#一般情况下安装社区版

yum install docker-ce docker-ce-cli containerd.io   # 安装社区版
yum install docker-ee docker-ee-cli containerd.io   # 安装企业版

3、启动Docker

命令:

systemctl start docker   # 启动Docker
docker version           # 查看当前版本号,是否启动成功
systemctl enable docker  # 设置开机自启动

4、Docker测试

拉取Docker的HelloWorld镜像
命令:
docker run hello-world
示例:
[root@iZ1608aqb7ntn9Z /]# docker run hello-world
Unable to find image 'hello-world:latest' locally  # 本地没有
latest: Pulling from library/hello-world           # pull一个最新版
b8dfde127a29: Pull complete                        # pull成功
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!                                 # 运行结果
This message shows that your installation appears to be working correctly.

5、Docker卸载

yum remove docker-ce docker-ce-cli containerd.io  		# 卸载依赖
rm -rf /var/lib/docker       # 删除资源 . /var/lib/docker是docker的默认工作路径

6、配置阿里云镜像

6.1 阿里云官网容器镜像服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dikPDByc-1628378213410)(Docker学习笔记.assets/image-20210803135001995.png)]

6.2 执行命令
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://axvfsf7e.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Docker运行流程和原理

1、启动流程

img

2、运行原理

在这里插入图片描述

3、Docker整体架构

img

Docker常用命令

1、基本命令

查看版本信息
docker version
查看系统信息
docker info   
帮助命令
docker 命令 --help       

docker COMMAND --help

2、镜像命令

查看镜像
docker images
搜索镜像
docker search
下载镜像
docker pull 镜像名[:tag]
删除镜像
docker rmi 	

3、容器命令

运行容器

docker run [可选参数] image

进入容器
docker run -it [容器ID] /bin/bash*

#参数说明
--name="名字"           指定容器名字
-d                     后台方式运行
-it                    使用交互方式运行,进入容器查看内容
-p                     指定容器的端口
( -p ip:主机端口:容器端口  配置主机端口映射到容器端口
  -p 主机端口:容器端口
  -p 容器端口)
-P                     随机指定端口(大写的P)
退出容器
停止并退出容器(后台方式运行则仅退出)	exit 		

不停止容器退出			Ctrl+P+Q
列出容器
	docker ps
删除容器
docker rm 容器id                 #删除指定的容器,不能删除正在运行的容器,强制删除使用 	rm -f
docker rm -f $(docker ps -aq)   #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和重启容器命令
docker start 容器id          *#启动容器* 

docker restart 容器id        *#重启容器* 

docker stop 容器id           *#停止当前运行的容器* 

docker kill 容器id           *#强制停止当前容器
查看容器中进程
*docker top 容器id*
查看容器元数据
*docker inspect 容器id*
进入运行中的容器
1、docker exec -it 容器id /bin/bash

------进入容器后开启一个新的终端,可以在里面操作(常用)

2、docker attach 容器id

------进入容器正在执行的终端,不会启动新的进程
从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径

4、其他命令

查看日志
docker logs --help

Logs选项      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)

常用:
docker logs -tf 容器id
docker logs -tf --tail number 容器id #num为要显示的日志条数
启动Es并增加内存
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

参数说明:
-d		后台运行
-p		镜像内端口映射主机
-e(环境配置)		对应es集群
-e(环境配置)		增加容器内内存

5、小结

attach	   Attach to a running container								    #当前shell下attach连接指定运行镜像
build	   Build an image from a Dockerfile							        #通过Dockerfile定制镜像
commit     Create a new image from a container changes						#提交当前容器为新的镜像
cp   	  Copy files/folders from the containers filesystem to the host path#从容器中拷贝指定文件或者目录到宿主机中
create	   create a new container											#创建一个新的容器,同run,但不启动容器
diff	   Inspect changes on a container's filesystem						#查看docker容器变化
events	  Get real time events from the server						    	 #从docker服务获取容器实时事件
exec		  Run a command in an existing container						 #在已存在的容器上运行命令
export      Stream the contents of a container as a tar archive	 #导出容器的内容流作为一个tar归档文件[对应import]
history		show the history of an image			                       #展示一个镜像形成历史
images		List images														#列出系统当前镜像
import  Create a new filesystem image from the contents of a tarball  #从tar包中的内容创建一个新的文件系统映像[对应export]
info			Display system-wide information							  #显示系统相关信息
inspect      Return low-level information on a container				  #查看容器详细信息
kill			  Kill a running container								 #kill指定docker容器
load			Load an image from a tar archive						#从一个 tar包中加载一个镜像[对应save]
login           Register or Login to the docker registry server 		#注册或者登陆一个docker 源服务器
logout		 Log out from a Docker registry server						#从当前Docker registry退出
logs			Fetch the logs of a container							 #输出当前容器日志信息
port 		   Lookup the public-facing port which is NAT-ed to PRIVATE_PORT   #查看映射端口对应的容器内部源端
pause		Pause a11 processes within a container							#暂停容器
ps				List containers												#列出容器列表
pull    Pull an image or a repository from the docker registry server #从docker镜像源服务器拉取指定镜像或者库镜像
push		Push an image or a repository to the docker registry server  #推送指定镜像或者库镜像至docker源服务器
restart       Restart a running container							   #重启运行的容器
rm			  Remove one or mdre containers								 #移除一个或者多个容器
rmi	  Remove one or more i mages     #移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run    		 Run a command in a new container					    #创建一个新的容器并运行一个命令
save			Save an image to a tar archive						#保存一个镜像为一个tar包[对应1oad]
search         Search for an image on the Docker Hub				#在docker hub 中搜索镜像
stats			#查看镜像内存
start			Start a stopped containers							#启动容器
stop            Stop a running containers							#停止容器
tag				Tag an image into a repos itory						#给源中镜像打标签
top				Lookup the running processes of a container			#查看容器中运行的进程信息
unpause		Unpause a paused container								#取消暂停容器
version			Show the docker version informati on				 #查看docker版本号
wait		Block until a container stops, then print its exit code	 #截取容器停止时的退出状态值

Docker可视化

1、portainer(目前使用)

docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true protainer/portainer

2、Rancher(常用)

(CI/CD持续集成/持续部署使用)

容器数据卷

1、什么是容器数据卷

目的:讲容器内的数据挂载到主机上。容器的持久化和同步操作,容器间数据也可以共享。

2、指定路径挂载

docker run -it -v 主机目录:镜像内目录

		#	-v 主机目录:镜像内目录

3、具名挂载

#写了卷名:容器内路径,与匿名挂载区别为定义了卷名.

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx	#-v 卷名:容器内路径

#查看定义卷名的
1、docker volum ls
2、docker volume inspect juming-nginx

4、匿名挂载(不建议)

#只写容器内路径,不写容器外路径,即匿名挂载

docker run -d -P --name nginx01 -v /etc/nginx nginx				#-v 只写容器内路径

docker volume ls        # 查看所有的挂载卷

5、卷默认位置

所有的docker容器内的卷,没有指定目录的情况下都是在'/var/lib/docker/volumes/xxxxxx/_data'

6、挂载设置权限

#通过  		-v 主机路径:容器内路径:ro/rw          改变读写权限
ro readonly		#只读
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

#ro只要看到ro就说明这个路径只有主机能够操作,容器内部无法操作

7、数据卷容器(容器间数据同步)**

镜像内数据同步操作

#创建一个父镜像 docker01
docker run -it --name docker01 zhouz/centos:1.0 /bin/bash 
ctrl+p+q  #退出镜像并在后台执行
#创建另外镜像02指向docker01
docker run -it --name docker02 --volumes-from docker01 zhouz/centos:1.0 /bin/bashduoe

多个mysql容器之间实现数据共享

docker run -d -p 8080:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zhou123 --name mysql01 mysql

docker run -d -p 8080:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=zhou123 --name mysql02 --volums-form mysql01 mysql

结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止.

创建镜像

1、commit命令创建

docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

2、Dockerfile构建

构建步骤:

  • 1、编写一个Dockerfile文件
  • 2、docker build 构建成为一个镜像
  • 3、docker run 运行镜像
  • 4、docker push 发布镜像(DockerHub、阿里云镜像仓库)

Dockerfile就是用来构建docker镜像的构建文件.

通过此脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层.

1、每个保留关键字(指令)都必须是大写字母

2、执行从上到下顺序执行

3、#表示注释

4、每一个指令都会创建 提交一个新的镜像层,并提交.

#创建Dockerfile文件,名字随意,建议用 Dockerfile      
vim Dockerfile
#写入内容		文件内指令(必须大写!!!)
FROM centos:7      	  #以centos7为基础构建镜像文件
VOLUME ["volume01","volume02"]     #创建两块卷
CMD echo "------end-----"	
CMD /bin/bash

#通过docker build命令构建镜像  
docker build -f dockerfile -t zhouz/centos:1.0 .
#	-f   Dockerfile脚本文件位置 
#	-t	 docker镜像名称:后跟版本号
#	. 	 默认上下文路径

3、DockerFile的指令

FROM			#基础镜像,一切从这里构建
MAINTAINER		#镜像是谁写的,姓名+邮箱     格式:MAINTAINER zhouz<123@qq.com>
RUN				#镜像构建的时候需要运行的命令
ADD				#添加内容到镜像内		   格式:ADD 文件名 镜像内路径 ,,添加压缩包自动解压
WORKDIR			#镜像的工作目录
VOLUM			#挂载的目录
EXPOSE			#保留端口配置    =    -p
CMD				#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTYRYPOINT		#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD			#当构建一个被继承的DockerFile 这个时候就会运行ONBUILD 的指令,触发指令.
COPY			#类似ADD,将我们的文件拷贝到镜像中
ENV				#构建的时候设置环境变量

在这里插入图片描述

4、DockerFile构建centos

创建自己的centos

#1、编写DockerFile文件
[root@zhouz dockerfile]# cat dockerfile-centos 
FROM centos
MAINTAINER zhouz<123@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash 

#2、通过这个文件构建镜像
docker build -f dockerfile路径 -t 镜像名:[tag] .

#3、运行测试

#4、查看镜像历史(构建过程)
docker history 镜像ID    
拿到镜像,可以用此命令看一下它是怎么做的。

5、DockerFile构建tomcat

1、准备镜像文件 tomcat压缩包,jdk压缩包。

2、编写dockerfile文件,官方命名Dckerfile,build会自动寻找这个文件,就不需要-f指定了。

#构建Dockerfile文件
[root@zhouz tomcat]# cat Dockerfile 
FROM centos:7
#签名
MAINTAINER zhou<123@qq.com>
##拷贝说明文件到镜像内
COPY readme.txt /usr/local/readme.txt
##添加安装包到镜像内,会自动解压、、安装包与Dockerfile文件在同一级目录下。
ADD apache-tomcat-8.5.81-src.tar.gz /usr/local/
ADD jdk-18_linux-x64_bin.tar.gz /usr/local/
###安装vim
RUN install yum vim

ENV MYPATH /usr/local
##启动工作目录
WORKDIR $MYPATH
###配置java和tomcat的环境变量到镜像内
ENV JAVA_HOME /usr/local/jdk-18.0.2
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.81-src
ENV CATALINA_BASH /usr/local/apache-tomcat-8.5.81-src
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME:bin
###默认开放8080端口
EXPOSE 8080
####开机启动tomcat 并可以在后面拼接命令  用&&拼接
CMD /usr/local/apache-tomcat-8.5.81-src/bin/startup.sh && tail -F /url/local/apache-tomcat-8.5.81-src/bin/logs/catalina.out

3、构建Docker镜像。

[root@zhouz tomcat]# docker build -f Dockerfile -t mytomcat .

4、启动镜像

#开启了8080端口映射、挂载了镜像内webapp目录和日志目录
docker run -d --name mytomcat01 -p 8080:8080 -v /home/tomcat/test:/usr/local/apache-tomcat-8.5.81-src/webapps/test -v /home/tomcat/tomcatlogs/:/url/local/apache-tomcat-8.5.81-src/logs 82c560dff0ed

5、这里操作失败,启动shell和dockerfile文件内shell会覆盖冲突

6、发布镜像

发布到Dockerhub

1、注册

https://hub.docker.com/

2、机器内登录dockerhub

[root@zhouz docker]# docker login -u zhouz666
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

net/http: TLS handshake timeout,如果报这个错,就把docker里面的daemon.json文件种添加一个国外镜像

#本机deamon.jsopn镜像配置
[root@zhouz docker]# cat daemon.json
{
	"registry-mirrors": ["https://registry.docker-cn.com","https://nlayiaq0.mirror.aliyuncs.com"]
}

3、上传自己的镜像到dockerhub上

#需要先修改docker镜像名称,docker tag diytomcat [你的dockerhub用户名]/diytomcat,提交也一样docker push [hub用户名]/diytomcat
#docker push (用户名)/(文件名):(版本号)

[root@zhouz docker]# docker tag feb5d9fea6a5 zhouz666/hello-world
[root@zhouz docker]# docker push zhouz666/hello-world
发布到阿里云镜像服务

登录阿里云平台—>容器镜像服务—>创建个人实例—>创建镜像仓库

1. 登录阿里云Docker Registry
$ docker login --username=XXXXXX 
用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。

2. 从Registry中拉取镜像
$ docker pull registry.cn-hangzhou.aliyuncs.com/XXX_test/XXX_test:[镜像版本号]

3. 将镜像推送到Registry
$ docker login --username=XXX registry.cn-hangzhou.aliyuncs.com
$ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/XXX_test/XXX_test:[镜像版本号]
$ docker push registry.cn-hangzhou.aliyuncs.com/XXX_test/XXX_test:[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId][镜像版本号]参数。

小结

在这里插入图片描述

Docker网络

1、理解Docke0

每次启动一个docker容器,docker就会给docker容器分一个ip,只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术。。。

#evth-pair就是一对的虚拟设备接口。他们都是成对出现的,一端连着协议,一端彼此相连。
#正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
#OpenStac、Docker容器之间的连接、OVS的连接,都是使用evth-pair技术

2、–net(指定网卡)

docker run --net 网卡名(指定网卡)

3、–link(不推荐使用)

思考一个场景,镜像项目不重启,镜像内IP换掉了,能不能通过镜像名来ping通镜像?

#启动一个tomcat01镜像
docker run -d -P --name tomcat01 tomcat
#通过--link绑定tomcat01的名字到tomcat02上,使02直接ping01的镜像名也能访问
docker run -d -P --name tomcat02 --link tomcat01 tomcat
#绑定完成通过镜像名也能ping通
docker exec -it tomcat02 ping tomcat01

–link就是在/etc/hosts配置中增加了一个tomcat02的配置

现在用Docker不建议使用 --link了。

自定义网络。不适用Docker0

docker0问题:不支持容器名连接访问。

4、自定义网络

查看所有的网络

[root@zhouz ~]# docker network ls

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKg2z0v5-1659858135291)(C:\Users\z5714\AppData\Roaming\Typora\typora-user-images\image-20220730194559803.png)]

网络模式
bridge : 桥接docker(默认)
none  : 不配置网络
host  : 和宿主机共享网络
container : 容器网络连通!(用的少,局限很大)
docker run -d -P --name tomcat01 tomcat
==
docker run -d -P --name tomcat01 --net bridge  tomcat
#因为bridge是默认网络模式,所以上面两句命令等同。
#docker0特点:默认,域名不能访问,--link可以打通。但是不推荐使用

#可以自己自定义一个网络来使用
--driver   网卡网络模式	  
--subnet 	设置子网地址
--gateway     定义网关
[root@zhouz ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#查看创建网卡的详细信息
[root@zhouz ~]# docker network inspect mynet
 ```shell 
 #使用创建好的网络来进行创建镜像,,,--net指定网络
 docker run -d -P --name tomcat01 --net mynet tomcat
 docker run -d -P --name tomcat02 --net mynet tomcat
 #指定网络创建的地址即为创建网络设定的子网内地址
 
 #直接使用地址和镜像名即可ping通
 ```

5、不同网段地址连通

问题:两个不同网络之间不能互通。。

利用docker network connect 命令,   让容器和网卡打通
#测试打通使用默认网络的镜像和使用自建网络的镜像打通

[root@zhouz ~]# docker network connect mynet tomcat0

docker network connect 网络名 容器名

#该操作直接把容器的地址放到网络配置文件内
#一个容器,两个地址

需要镜像跨网络操作,就需要使用docker network connect 打通。。

实战:部署Readis集群

readis还没学,先搁置。。。。。。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值