Docker与微服务实战2022:基础篇



一、简介

1.1、docker是什么

  • Docker是基于Go语言实现的云开源项目。
  • Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

在这里插入图片描述
Linux容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而 Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。


1.2、为什么要用docker

  1. docker有着比虚拟机更少的抽象层
  2. docker利用的时宿主机的内核,而不需要加载操作系统内核

二、安装docker

1、安装

# 1、安装gcc相关
yum -y install gcc
yum -y install gcc-c++


# 2、安装开发utils
yum install -y yum-utils


# 3、安装阿里云仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


# 4、更新yum软件包索引
yum makecache fast


# 5、安装dockers engine
yum install -y docker-ce docker-ce-cli containerd.io


# 6、启动并设置开机自启动
systemctl start docker
systemctl enable docker

2、配置阿里云镜像

阿里云镜像地址

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://aikv7hec.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

3、测试

docker run hello-world			# 运行
docker ps						# 查看正在运行的容器
docker ps -a					# 查看历史运行的容器
docker rm id					# 删除容器
docker images					# 查看所有镜像
docker rmi imageId				# 删除镜像

三、操作命令

在这里插入图片描述

3.1、帮助命令

systemctl .... docker
		  start 	# 开启
		  stop 		# 停止
	 	  restart 	# 重启
	 	  status 	# 状态
	 	  enable 	# 开机自启
docker info 
docker --help
docker xxx --help

3.2、镜像命令

# 1、搜索
docker search xx 			# 查询
docker search --limit 5 xx  # 查询前5条

# 2、拉取
docker pull xx				# 拉取最新
docker pull xx:version		# 拉取对应版本

# 3、查看镜像
docker images	 			
				-a 			# 列出本地所有镜像
				-q 			# 只显示镜像id

# 4、查看镜像/容器/数据卷所占空间
docker system df

# 5、删除
docker rmi xx						# 删除
docker rmi -f xx					# 强制删除
docker rmi `docker images -q`		 #强制删除所有

3.3、容器命令

1、运行

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--name xx					# 为容器指定一个名称
-d							# 后台运行容器并返回容器id,也即启动守护式容器

-i							# 交互模式运行容器,通常与-t使用
-t							# 为容器分配一个伪输入终端,通常与-i使用
							# 也即交互模式启动容器(前台有伪终端,等待交互)
						
-P							# 指定端口映射---随机
-p							# 指定端口映射---指定 

-d							# 后台守护式运行

# 测试:启动ubuntu并进入容器内部
docker run -it ubuntu /bin/bash

2、展示容器

docker ps					# 列出运行中的容器
		  -a				# 列出所有容器
		  -l 				# 显示最近创建
		  -n 5				# 显示最近5个
		  -q				# 只显示id

3、退出容器

exit						# 容器停止
ctrl+p+q					 #不停止退出

4、开关操作

docker start id/name		# 启动已停止的容器
docker restart id/name		# 重启
docker stop id/name			# 停止
docker kill id/name			# 强制停止

5、删除

docker rm id					# 删除
docker rm -f id 				# 强制删除
docker rm -f $(docker ps -aq)	 #强制删除所有

6、查看容器信息

docker logs id				# 查看日志
docker top id				# 查看容器内运行的进程
docker inspect id			# 查看容器内部细节

7、交互模式进入容器

docker exec -it id /bin/bash 	# exit退出不会停止容器
docker attach id						 # 会停止容器

# 进入redis服务
docke exec -it id redis-cli

8、从容器拷贝文件到主机

docker cp id:容器内路径 目的主机路径 

9、导入导出容器

docker export id > xx.tar								导出为tar文件
cat xx.tar | docker import - 镜像用户/镜像名:镜像版本号		将tar转为容器对象

10、参考图片
在这里插入图片描述


四、镜像分层

Docker中的镜像分层,支持通过扩展原有镜像,创建新的镜像

案例:ubuntu里面无vim

1、更新包管理工具

apt-get update			
apt-get install vim 	安装

2、打包为新镜像

docker commit -m="提交信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
docker commit -m="vim cmd add ok" -a="laptoy" cid myubuntu:1.0

在这里插入图片描述



五、本地镜像推送到阿里云

在这里插入图片描述

1、阿里云镜像服务操作

阿里云容器镜像服务

1、进入个人实例在这里插入图片描述
2、创建命名空间
创建命名空间

3、创建镜像仓库
在这里插入图片描述
4、点击管理
在这里插入图片描述

2、实操

# 1、登录阿里云Docker Registry
docker login --username=la**** registry.cn-hangzhou.aliyuncs.com

# 2、push
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/laptoy/myubuntu:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/laptoy/myubuntu:[镜像版本号]

# 3、pull
docker pull registry.cn-hangzhou.aliyuncs.com/laptoy/myubuntu:[镜像版本号]


六、本地镜像推送到私有库

1、下载镜像Docker Registry

docker pull registry

2、运行docker私服库

docker run --name registry \
-p 5000:5000 \
-v /mydata/myregistry/:/tmp/registry \
--privileged=true \
-d registry

3、ubuntu安装ifconfig命令并打包(将容器打包为镜像)

apt-get update
apt-get install net-tools
docker commit -m="ifconfig add ok" -a="laptoy" cid myubuntu:1.0

4、验证私服库是否存在镜像

curl -XGET http://192.168.56.10:5000/v2/_catalog

5、将新镜像修改为符合私服规范的tag

docker tag 镜像:Tag Host:Port/Repository:Tag
docker tag myubuntu:1.0 192.168.56.10:5000/myubuntu:2.0

6、修改配置文件使其支持http

vi /etc/docker/daemon.json
加入,"insecure-registries":["ip:port"]到json串中		注意逗号

`重启docker`

7、推送到私服库

docker push 镜像名
docker push 192.168.56.10:5000/myubuntu:2.0

8、验证私服镜像列表

curl -XGET http://192.168.56.10:5000/v2/_catalog

在这里插入图片描述

9、拉到本地

docker pull Host:port/镜像:[Tag]

七、容器数据卷

1、设置root权限

Docker挂载如果出现cannot open directory.:Permission denied

挂载目录后加--privileged=true,使用该参数,容器的root拥有真正的root权限

2、挂载目录

宿主机目录和容器目录互通互联(容器停止也会数据共享)

1、操作

-v 宿主机目录绝对路径:容器路径

2、测试

docker run -it --name myubuntu \
-v /mydata/ubuntu/tmp/host_data:/tmp/docker_data \
--privileged=true \
-d ubuntu \

3、查看挂载信息

docker inspect id

在这里插入图片描述

3、设置容器读写权限

1、默认容器内部为可读可写
-v 宿主机目录:容器路径:rw
2、设置容器只读
-v 宿主机目录:容器路径:ro

4、容器卷之间的继承(实际为复用-v指令)

宿主机和关联容器都实现数据共享

--volumes from 父容器
docker run -it --privileged --volumes from u1 --name u2 ubuntu

问:u1停止了,u2会怎么样?
答:u2扔和宿主机共享数据
u1启动后依旧有停止时u2和宿主机共享的数据
结论:–volumes from 仅实现挂载父类路径规则


八、安装常用软件(tomcat,mysql,redis,nginx)

设置容器自启动

docker update id --restart=always

8.1、tomcat

docker pull tomcat:7.0.70
docker run -d -p 8080:8080 --name tomcat tomcat:7.0.70

最新版tomcat10的webapps为空目录,需要把webapps删除,再将webapps.dist改为webapps


8.2、mysql

1、配置my.cnf解决字符编码问题

cd /mydata/mysql/conf
vi my.cnf 

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

2、运行容器

docker run -p 3306:3306 --name mysql \
--privileged=true \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7

3、查看字符编码

mysql> SHOW VARIABLES LIKE 'character%';

8.3、Redis

1、拷贝一份redis.conf到宿主机目录

cp source [宿主机目录]

2、修改配置文件

2.1、禁用仅本地连接

# bind 127.0.0.1

2.2、关闭守护进程后台启动

daemonize no

2.3、关闭保护模式

protected-mode no

3、运行容器

docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf

4、进入客户端

docker exec -it redis bash

redis-cli

8.4、Nginx

找一份nginx.conf放在/mydata/nginx/conf目录下

# 可以通过先运行一个nginx容器
docker run -p 80:80 --name nginx -d nginx:1.10
# 拷贝容器内的nginx.conf到宿主机目录
docker cp nginx:/etc/nginx/nginx.conf /mydata/nginx/conf
# 删除容器
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \	# 将宿主机目录挂载到容器内部目录
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-d nginx:1.10									# 后台运行容器,并返回容器ID;
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laptoy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值