Docker(一)

1. 什么是容器

容器是隔离的环境中运行的一个进程,如果进程结束,容器就会停止,容器的隔离环境,拥有自己的ip地址,系统文件,主机名,进程管理。

程序:代码,软件,命令
进程:正在运行的程序

2. 容器和虚拟机的区别

虚拟机: 硬件cpu支持(vt虚拟化),模拟计算硬件,走正常的开机启动
bios开机自检–根据bios启动项–读取硬盘第一个扇区grub,uefi,centos7,加载内核,启动系统第一个进程/sbin/init systemd

容器:不需要硬件cpu的支持,共用宿主机内核,启动容器的第一个进程
容器优势:启动快,性能高,损耗少,轻量级

100虚拟机 100个服务 10宿主机
100容器 100个服务 6宿主机

在这里插入图片描述

3. docker-ce的安装

#安装docker-ce
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum install docker-ce -y

systemctl start docker
systemctl enable docker


#验证
[root@docker01 ~]# docker version
Client: Docker Engine - Community
 Version:           24.0.2
 API version:       1.43
 Go version:        go1.20.4
 Git commit:        cb74dfc
 Built:             Thu May 25 21:55:21 2023
 OS/Arch:           linux/amd64
 Context:           default
# 这是因为docker服务没有启动
Cannot connect to the Docker daemon at 
unix:///var/run/docker.sock. Is the docker daemon running?

[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# systemctl enable docker
[root@docker01 ~]# docker version
Client: Docker Engine - Community
 Version:           24.0.2
 API version:       1.43
 Go version:        go1.20.4
 Git commit:        cb74dfc
 Built:             Thu May 25 21:55:21 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.2
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.4
  Git commit:       659604f
  Built:            Thu May 25 21:54:24 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.21
  GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
 runc:
  Version:          1.1.7
  GitCommit:        v1.1.7-0-g860f061
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# 时速云: index.tenxcloud.com

小技巧:

# 用yum命令安装软件,收集安装包,在没有网络的情况下软件
vim /etc/yum.conf
# 用yum下载rpm包,下载安装完之后就删了。如果keepcache=1,rpm包就不删了
keepcache=0

# 缓存目录: /var/cache/yum
# 收集rpm包: 
find /var/cache/yum -type f -name "*.rpm"
mkdir docker1903_rpm
find /var/cache/yum -type f -name "*.rpm" | xargs mv -t docker1903_rpm
tar zcf docker1903_rpm.tar.gz docker1903_rpm

# 进行安装软件
cd  docker1903_rpm
yum localinstall -y "*.rpm"

4. docker主要内容

docker是一个cs架构, docker主要:镜像 容器 仓库 网络 存储 监控
docker是一个软件的打包技术.

docker run -d -p 80:80 nginx:alpine
run 创建并启动一个容器
-d 放后台启动
-p 端口映射
nginx:latest docker镜像名称

5. docker镜像常用命令

# docker镜像命令都被分成了组,镜像有关的命令
[root@docker01 ~]# docker image 
build    history  import   inspect  load     ls       prune    pull     push     rm       save     tag
docker search 搜索镜像, 优先选官方,stars数量多
docker pull 拉取镜像(下载镜像)
docker push 推送镜像(上传镜像)

docker save 导出镜像
例子:docker save centos:7 -o docker_centos7.tar.gz

docker load 导入镜像(import导入镜像没有导入名称)
例子: docker load -i docker_nginx.tar.gz 

docker images 查看镜像列表(或者 docker image ls)

docker rmi 删除镜像(docker image rm )
例子:docker rmi 1d12345ds

docker  tag 镜像id  给镜像打标签
例子:doker image tag 1d12345ds nginx:v1

docker image inpect   看镜像的属性
例子: docker image inpect nginx:v1

docker image prune 清理没有名称或无效的镜像(清理黑户)
例子: docker image import  nginx.tar.gz
 	  docker image prune # 因为import导入的镜像不带名称所以会被清理掉

小提示:

官方镜像   docker.io/library/nginx:1.18-alpine
用户镜像	  docker.io/dong/alpine:3.9
第三方镜像 index.tenxcloud.com/system_containers/metrics-server-amd64:v0.3.1

docker自动补全命令
# 安装自动补全命令
yum install bash-completion
# 启用自动补全
source /usr/share/bash-completion/bash_completion

6. docker容器常用命令

# docker镜像命令都被分成了组,容器相关的命令
[root@docker01 ~]# docker container 
attach   create   export   logs     port     restart  start    top      wait     
commit   diff     inspect  ls       prune    rm       stats    unpause  
cp       exec     kill     pause    rename   run      stop     update
docker run 创建并启动容器
例子:docker run -d -it -p 80:80 nginx:latest
docker create 创建容器 --name
docker start 启动容器
docker stop 停止容器
docker restart 重启容器
docker kill 强制停止容器
docker ps 查看容器列表 -a 查看所有容器
docker rm 删除容器
批量删除所有容器 docker rm -f `docker ps -
a -q`
docker exec 进入正在运行的容器(分配一个新终
端)
例子: docker exec -it 容器id/容器名字
/bin/bash(/bin/sh)
docker attach 进入正在运行的容器(使用相同的终
端),偷偷离开的快捷键ctrl +p,ctrl +q

容器想要放在后台一直运行的话,那么容器的初始命令,必须夯住(前台运行),否则容器就会退出。

前台运行

nginx -g 'daemon off;'
/usr/sbin/php-fpm --nodaemonize

小提示:

# 如果只有-it 参数docker run的时候直接交互式的进入容器。有的容器-it可以,有的容器-it不可以
# 启动并进入容器,模拟初始命令是/bin/bash
docker run -it centos:7  

# -d 后台启动 -it 分配一个交互式的终端
# -d -it 还是把容器放到后台里面,不会直接进入容器
docker run -it centos:7  

# 一般直接使用docker run
docker run = docker create + docker start 

# 一般使用docker ps -a 显示多有的容器,docker ps只显示正在运行的容器
docker container ls - a 显示所有的容器  = docker ps -a  
# 显示完整信息(比如长id、COMMAND)
docker ps -a --no-trunc
# 运行nginx:alpine容器,容器默认的初始命令是nginx -g 'daemon off', 含义是nginx在前台运行,-g 参数在配置文件外生效 
nginx -g 'daemon off' 

# 进行查看使用镜像启动容器时的初始命令时什么,每个镜像都会有容器的初始命令
docker inspect centos:7 | grep -i cmd
CMD [\"/bin/bash"\]  # 默认初始命令是/bin/bash

# 启动容器时手动指定初始命令,手动指定的优先生效
docker run -d   centos:7 sleep 100 
# 如果手动指定的是错误的命令,则容器会秒死。例如:
docker run -d   centos:7 sleep (sleep后面需要跟时间)


# docker ps -a回显中COMMAND,COMMAND 每产生一个进程,就要执行一个命令,由初始命令产生的进程,才有了这个容器,容器的名字默认生成的
[root@docker01 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 自定义容器名称,启动容器,不仅可以使用容器id,也可以使用容器名字   
docker container create --name  dong nginx:latest
docker container start dong  后面可以跟容器名字

# 清除停止状态下的容器
docker container prune 
# 无法删除正在运行的容器。可以先停止容器,然后在进行删除,或者加参数-f强制删除
docker rm dong  
# -l 查看最新的一个容器,-a 不管容器死活都会显示出来
docker ps -l -a   

# ctrl+d退出容器的时候容器就死了,执行多次命令使用的都是要给终端
docker attach  
# ctrl+d退出容器,容器还存活,执行多次使用的不同的终端,一般使用docker exec
# 进入容器后,容器的id默认就是容器的主机名
docker exec -it

7. docker端口映射

docker run
-p 宿主机端口:容器端口  (常用)
-p 宿主机ip1:宿主机端口:容器端口 (多个容器同时使用 80 端口)
-p 宿主机ip1::容器端口 随机端口映射
-p 宿主机ip1::容器端口/udp 使用udp协议做随机端口映射
-p 80:80 -p 3306:3306 (常用,映射多个端口)
-p 1111 -1119:1111-1119 端口范围映射

-P 自动随机端口映射

Docker网络原理和端口映射:
Docker内部默认使用的是NAT转换
NAT转换的两个必要条件:1. 内核转换参数 2. iptables规则

在这里插入图片描述
小提示:

# 查看内核参数
sysctl -a| grep ipv4| grep forward
net.ipv4.ip_forward = 1(nat转换必须调的参数为1才生效)
sysctl net.ipv4.ip_forward=0 (设置参数为0)
systemctl restart docker (只要重启docker服务,内核参数默认为1)

# 查看iptables规则
iptables -t nat -L -n
## 只要来自172.17.0.0/16的数据包,都会模拟成外网ip出口ip
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80
Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80

# -p 只需要加参数,系统会自动在iptables中加入端口映射,方便使用docker

# 给网卡eth0加多个IP地址
ifconfig eth0:1 10.0.0.9/24 up
ifconfig eth0:0 10.0.0.11/24 up

8. docker数据卷

docker run
-v 宿主机绝对目录:容器目录 # 注意-v 挂载的时候,文件对文件,目录对目录
-v 容器目录 #创建一个随机卷,来持久化容器的目录下的数据
-v 卷名:容器目录 #创建一个固定名字的卷,来持久化容器的目录下的数据
--volumes-from 跟某一个容器挂载所有相同的卷

小提示:

# docker container cp 和docker run -v 宿主机绝对目录:容器目录。 前者时拷贝,后者是挂载

# (1)-v 宿主机绝对目录:容器目录,举个例子:
# 将宿主机中的/opt/test.txt文件拷贝到容器(213fds)的/mnt下
docker container cp  /opt/test.txt   213fds:/mnt
# 将容器(213fds)的/mnt/test.txt拷贝到宿主机/opt下 
docker container cp 213fds:/mnt/test.txt    /opt/
# 将/opt/目录挂载到容器的/usr/share/nginx/html(/opt类似于是容器的磁盘)
docker run -d -v /opt/:/usr/share/nginx/html nginx:alpine


# (2)-v 容器目录 ,创建一个随机卷,来持久化容器的目录下的数据,举个例子:
## 启动容器,进行容器/usr/share/nginx/html目录下数据持久化
[root@docker01 ~]# docker run -d -v /usr/share/nginx/html nginx:alpine
fa3149ac49c849bc8e88506cd9c445fabe5623f0ab7a912e37a1c3ed5974a2c3
## 查看数据卷
[root@docker01 ~]# docker volume ls
DRIVER    VOLUME NAME
local     adc1aaf67f3f7d01c4758ebc081365cb248615105b38a3bbb2ab65209f6c2acc
## 宿主机具体持久化容器数据的目录
[root@docker01 ~]# ls /var/lib/docker/
buildkit/   engine-id   network/    plugins/    swarm/      volumes/    
containers/ image/      overlay2/   runtimes/   tmp/        
## 具体的持久化容器/usr/share/nginx/html目录下的数据
[root@docker01 ~]# ls /var/lib/docker/volumes/adc1aaf67f3f7d01c4758ebc081365cb248615105b38a3bbb2ab65209f6c2acc/_data/
50x.html  index.html


docker volume 命令也进行分组了
docker volume ls

# (3) -v 卷名:容器目录,创建一个固定名字的卷,来持久化容器的目录下的数据
[root@docker01 _data]# docker run -d -v /opt/:/usr/share/nginx/html nginx:alpine
60ff4f77334bbab8b5543bba246d21fc232d08e07d28ff4eebd401db98894eb9
[root@docker01 _data]# docker volume ls
DRIVER    VOLUME NAME
local     adc1aaf67f3f7d01c4758ebc081365cb248615105b38a3bbb2ab65209f6c2acc
local     nginx
[root@docker01 ~]# ls /var/lib/docker/volumes/nginx/_data
50x.html  index.html

(4) --volumes-from 跟某一个容器挂载所有相同的卷
# 挂载三个目录
docker run -d -it -v /etc/:/tmp -v /usr/bin:/opt -v /tmp:/data centos:7
# 这个要启动的容器要与已存在的容器(bf094100),挂载的内容一样
docker run -it --volumes-from bf094100 centos:7

小练习:
只启动一个nginx容器,要求访问 80 端口,出现nginx默认欢迎首页,访问 81 端口,出现小鸟飞飞。

# 方法一: 
docker run -d -p 80:80 -p 81:81 -v /opt/xiaoniao:/code  nginx:latest
docker exec -it 865csge45 /bin/bash
cd /etc/nginx/conf.d/
echo ' server {
		listen     81;
		server_name localhost;
		location / {
			root  /code;
			index  index.html  index.htm;
		}
	}' >xiaoniao.conf
exit
docker restart 865csge45

# 方法二: 
docker run -d -p 82:80 -p 83:81 -v /opt/xiaoniao:/code  nginx:latest
docker cp  /opt/xiaoniao.conf  h26ajill:/etc/nginx/conf.d
docker restart h26ajill

# 方法三:
docker run -d -p 84:80 -p 85:81 -v /opt/xiaoniao.conf:/etc/nginx/conf.d/xiaoniao.conf -v /opt/xiaoniao:/code  nginx:latest

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值