Bootstrap

Docker容器的基本操作

1 容器操作

  • 添加容器的两种方法

  • 会自动添加生成一个随机名字

image-20240620161312867

image-20240620161435511

# 启动docker
systemctl status docker
systemctl start docker

systemctl daemon-reload   # 重新加载docker配置
systemctl restart docker  # 重启docker

#1 镜像操作
	-docker search
	-docker pull
    -docker images  
    -docker rmi
 
#2 镜像运行,变成容器---》一个镜像可以运行处多个容器--》把一个容器当成一个虚拟机
	-操作系统
    -文件
    -软件
    -网络
    
# 3 运行出一个容器

1.1 run

# 1 把镜像运行成容器 
# 运行,如果镜像没有,会去远程仓库下载
docker run -id --name=centos7 centos:centos7
# -id  :启动容器,不进入容器内部
# -it :启动容器,进入容器内部
# --name:指定容器名字,容器名字不能重复,如果重复就报错,可以随便起
# centos:centos7:基于哪个镜像运行成容器



# 2 查看正在运行的容器
docker ps


# 直接输入pwd即可显示当前路径


# 3 执行:docker run -it  centos:centos7 
进入到容器内部,可以执行centos的命令,但是它是最精简的系统,很多命令可能没有,用的话需要安装
退出容器,回到宿主机:exit


# 4 容器需要创建然后运行
	-创建:create命令
    -运行:run
    -但是docker不需要create 直接用run即可 
# 5 #### 容器要运行,内部必须有个前台进程阻塞,否则容器就会停掉###

# 6 docker ps -a   #查看所有容器,包括停止的

# 7 删除容器
docker rm 容器名字/容器id

image-20240708193321536

1.2 run 时参数

# docker run 参数
    -i 表示运行容器
    -d 以守护式容器在后台运行,用这个参数创建出来的容器,命令行还在宿主机上,没有进入到容器内部
    -t 表示容器启动后会进入容器命令行。加入这参数后,容器创建就能登录进去。即分配一个伪终端。
    --name 指定容器名字,如果不指定,会随机一个名字
    -p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
    -v 表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上

几个小案例

# 1 启动一个centos容器并且进入,名字叫mycentos,在内部装个vim,然后退出
	1 docker run -id --name=mycentos centos:centos7
    2 在宿主机
    3 docker exec -it mycentos /bin/bash  # 新开了一个bash进程
    4 yum install vim -y
    5 exit
    6 容器停还是没有停?没有,因为容器运行时的 bash 进程没有结束
    
    
    
    
# 2 docker exec  命令
	在宿主机,链接容器,执行命令,把命令结果返回给宿主机
    docker exec 362a ls
    
    
# 3  进入到容器内部
	# 在容器上执行命令
	docker exec 容器名字/id  命令
    # 利用这个特性-->进入到容器内部
    docker exec -it 容器名字/id /bin/bash
    # 精简版进入 
    docker exec -it python sh
    # 退出,结束掉 /bin/bash
	exit

1.3 -v

image-20240708193335784

​ 当你在Docker中使用-v--volume选项挂载宿主机的目录或文件到容器中时,确实会存在一种双向的文件共享关系,这可能会影响到宿主机上的内容。以下是对这种情况的详细解释:

  1. 文件或目录的挂载:使用-v选项,你可以将宿主机的文件或目录挂载到容器中的某个位置。这允许容器中的应用程序访问和操作这些文件或目录。
  2. 双向的文件共享:Docker的-v挂载是双向的,这意味着容器和宿主机之间的文件或目录是共享的。在容器中对挂载的文件或目录所做的任何更改都会反映到宿主机上,反之亦然。
  3. 内容变更的影响
    • 如果你在容器中修改了挂载的文件或目录的内容,这些更改将同步到宿主机上的原始文件或目录。
    • 如果你在宿主机上修改了挂载的文件或目录的内容,这些更改也将同步到容器中的对应位置。
  4. 注意事项
    • 由于这种双向同步的特性,你需要特别小心,确保不会意外地删除或修改重要的宿主机文件或目录。
    • 如果你需要保留宿主机上的原始内容,可以在挂载之前备份这些文件或目录。

先在宿主机创建一个

xx.txt文件

在到容器里面的cd jing路径 xx.txt 是先宿主机跟容器的共享

image-20240620202512278
在这里插入图片描述

  • 然后你返回宿主机也是一样的
docker run -id --name=centos7 -v /root/jing:/jing centos:centos7

具体来说:

宿主机上的 /root/jing 目录是源目录。
容器内的 /jing 路径是目标路径。
当容器运行时,你可以像在宿主机上操作 /root/jing 一样来访问和操作容器内的 /jing 目录中的文件。任何在容器内对 /jing 目录的修改都会反映到宿主机的 /root/jing 目录中,反之亦然。
# 1 -v 参数表示运行容器时,跟宿主机的文件目录做映射


#2 小案例
    # 运行出一个 centos77 容器,不进入, 做目录映射
    # 把宿主机的 /root/lqz文件夹  映射到 容器内部的 /lqz文件夹  容器如果没有文件夹会自动创建
    # -v可以写多个,可以是文件或文件夹
	
    # 宿主机进行创建
    1 cd # 回家 前提是你是root用户
    2 mkdir lqz  # 在root目录下创建lqz文件夹
    3 运行容器,做目录映射
    docker run -id --name=centos7 -v /root/lqz:/lqz centos:centos7
    4 在宿主机的 /root/lqz 下新建 xx.txt
    vim xx.txt

    5 来到容器内部:看这个文件在不在
    cat xx.txt

    6 他们是相互影响的:
        容器内部修改文件---》会影响外部
        外部修改文件---》影响内部



# 3 目录映射好处是,后期咱们部署django项目
	1 有个django容器,做好映射,代码放在宿主机上即可,以后更新了代码,只要重启容器,代码就是最新了
    2 运行mysql容器---》mysql配置文件,数据data目录,放在宿主机上做好映射
    	如果 mysql容器---》表数据,放到容器中---》如果删了容器---》数据库全没了
    	表数据,放在宿主机上---》把容器删除---》表数据还在----》再启动一个容器做好映射---》数据都还在

        
        
 
# 4 一次性删除

# 一次性删除所有容器
docker rm `docker ps -a -q`
# 一次性删除所有镜像
docker rmi `docker images -q`


1.4 -p

  • 创建mysql的环境变量

docker run -id --name=mysql5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

yum install net-tools -y
netstat -nlp | grep 3307


# unbentu
sudo apt update
sudo apt install net-tools
# 验证是否安装成功!
dpkg -l | grep net-tools
netstat -nlp | grep 3308

image-20240620202647575

前提条件宿主机要用3307端口 这样不止容器可以访问 window也能进行访问

image-20240620205914945

mysql -h 10.0.0.100 -P 3307 -uroot -p
# mysql -h 宿主机ip地址 -P 宿主机的端口 -uroot -p

image-20240620210152929

image-20240620210507075

  • 这个也能实现文件之间的共享

image-20240620210728005

image-20240620211010042


dpkg -l | grep net-tools

image-20240620230528935

netstat -nlp | grep 3308

docker run -id --name=mysql5.7 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

docker ps

image-20240620230828414

docker exec -it mysql5.7 /bin/bash

mysql -u root -p

image-20240620231335939

image-20240620231346889

在这里插入图片描述

# 1  -p参数:端口映射  容器中启动一个mysql5.7 --》容器中的3306监听,宿主机3306没人监听,做端口映射后,宿主机的3306就被docker的这个容器监听了

# 2 小案例,运行一个mysql容器--》做端口映射
docker run -id --name=mysql5.7 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
#  -p: 启动mysql容器  -p 宿主机端口:容器端口
# -e :启动的mysql的root密码是123456
# 以后台守护进程运行mysql容器,mysql的root用户密码是123456,宿主机和容器做了端口映射
	宿主机 3307 映射容器 3306

    
## 2.1 查看宿主机 3307端口占用情况

    #  netstat -nlp |grep 3307 查看本机80端口占用情况
    # 查看宿主机 3307端口占用情况
    yum install net-tools -y
    netstat -nlp | grep 3307 # 被docker占了

## 2.2 远程链接宿主机的3307端口
	以后访问宿主机3307端口就等于访问容器的3306端口

    # windoes机器可以远程链接 mysql
        -命令行链接:mysql -h 10.0.0.110 -P 3307 -uroot -p
        -Navicate: 链接,创建lqz数据库

    # 宿主机--》进入到容器内部--》进入到mysql,查看有没有创建lqz这个库
        docker exec -it mysql5.7 /bin/bash # 进入容器内部
        mysql -uroot  -p  # 进入mysql
        show databases;  # 查看所有数据库
    
    

1.5其他

docker start mysql5.7

image-20240620211727500

image-20240620211857319

  • 拷贝

image-20240620213729119

  • 查看容器ip地址

image-20240620214026409

# 在主机执行
#1 启动容器
	docker start 容器id 
#2 停止容器
	docker stop 容器id


    # 在主机里面执行
#3  mysql的容器底层的操作系统是 debian 装软件需要用 
    apt-get update
    apt-get install vim -y



#4  文件拷贝(宿主机执行)
	# 容器的文件copy到宿主机上(不是在容器内执行)
    docker cp 容器名称:容器目录 需要拷贝的文件或目录
    docker cp  0a9633190cb9:/xx.txt /root/lqz/lqz.txt
    
    # 宿主机的文件copy到容器中
    docker cp 需要拷贝的文件或目录 容器名称:容器目录
    docker cp /root/lqz/xx.txt  0a9633190cb9:/xx.txt

        
        
    
   # 主机里面执行
# 5 查看容器IP地址    
	docker inspect 容器名称  # 查看容器的详细描述,很多
    docker inspect ea5f3c9ee99a --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
    
    
# 6 在多个容器之间是可以ping通的(容器和宿主机也可以)
    # python:172.17.0.3

    # mysql5.7:172.17.0.2

    # 宿主机--》ping 它俩
    # 容器--》容器
    apt-get install iputils-ping
     ping 172.17.0.2

    
    
    
    
# 7 删除容器(删除已停止的容器)
	docker rm 容器id  
    docker rm `docker ps -a -q`
    # 加个 -f 强制删除
    docker rm -f 7342e5435963

    
    

    

    
# 8 无状态的服务(在容器中尽量运行无状态的服务)
    -mysql reids   有状态,运行过程中产生数据,保存,容器删除,数据就没了
    -uwsgi+django  无状态的服务
    
  

    
    
    
# 9 补充
	1 ip地址  ip 
    	10.0.88.110
        10.0.0.111
        10.0.0.1
        10.0.11.1
    2 子网掩码 mask
    	255.255.0.0
        
    3 网关 gatway
    	10.0.0.1

2 应用部署

unbantu 要注意的就是在因为我用的是jingyi用户所以创建的文件是在/ 根目录下的

2.1 mysql 部署

image-20240620214211686

#0 dokcer 中部署mysql,以后不需要在宿主机上装mysql
	

#1  没有做目录映射---》配置文件--》表数据都在容器中---》一旦删除--》所有都没了
docker run -di --name=mysql -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7


# 2 做目录(配置文件和数据文件)和端口映射

# 做目录映射:data文件,配置文件
# 创建文件夹
mkdir /mysql
mkdir /mysql/conf.d
mkdir /mysql/data/
vi /mysql/my.cnf
[client]
default-character-set=utf8
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

docker run  -di -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3306:3306 --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7      
        
     
    
# 创建库,创建表,插入数据

# 关闭容器,删除容器,myslq的容器没了,但是数据在宿主机上放着
 docker stop mysql2
 docker rm mysql2
##docker rm mysql -f  容器之间删了

# 再运行起一个容器,做好目录映射,数据都回来了
docker run  -id -v /mysql/data/:/var/lib/mysql -v /mysql/conf.d:/etc/mysql/conf.d -v /mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 



# 补充  -e参数--》环境变量
	-不同镜像提供不同参数
    -传入后放入环境变量
    echo $MYSQL_ROOT_PASSWORD
	
  1. docker run:这是 Docker 的命令,用于从指定的镜像启动一个新的容器。
  2. -di:这实际上是两个参数 -d-i 的简写,但通常 -i-t(分配一个伪终端)一起使用。在这里,-d 是正确的,它表示“分离模式”(detached mode),即容器在后台运行。但 -i 是不必要的,并且可能会被误解,所以你应该使用 -d 而不是 -di
  3. -v /mysql/data/:/var/lib/mysql:这是一个卷(volume)映射。它将宿主机上的 /mysql/data/ 目录映射到容器内的 /var/lib/mysql 目录。这意味着容器内的 MySQL 数据库文件将存储在宿主机的 /mysql/data/ 目录下,这样即使容器被删除,数据仍然保留。
  4. -v /mysql/conf.d:/etc/mysql/conf.d:另一个卷映射。它将宿主机上的 /mysql/conf.d 目录映射到容器内的 /etc/mysql/conf.d 目录。这允许你在宿主机上放置自定义的 MySQL 配置文件,并在容器启动时使用它们。
  5. -v /mysql/my.cnf:/etc/mysql/my.cnf:与上面的类似,这也是一个卷映射。它将宿主机上的 /mysql/my.cnf 文件映射到容器内的 /etc/mysql/my.cnf 文件。这是 MySQL 的主要配置文件。
  6. -p 3306:3306:端口映射。它将宿主机的 3306 端口映射到容器内的 3306 端口。这样,当你尝试连接到宿主机的 3306 端口时,实际上是在连接到容器内的 MySQL 服务。
  7. –name mysql5.7:为新容器指定一个名称,这里是 mysql5.7
  8. -e MYSQL_ROOT_PASSWORD=123456:设置环境变量。在这里,它设置了 MySQL 的 root 用户的密码为 123456
  9. mysql:5.7:这是你要从中启动容器的 Docker 镜像的名称和标签。这里,你正在使用官方的 MySQL 5.7 镜像。

​ 所以,总的来说,条命令从 mysql:5.7 镜像启动了一个新的 Docker 容器,设置了 MySQL 的 root 密码,并配置了数据、配置和主要配置文件的卷映射。

image-20240620235531457

image-20240620235746434

2.2 redis部署

#1  拉取redis镜像
docker pull redis  #最新
mkdir /root/data
vim /root/redis.conf

bind 0.0.0.0
daemonize NO
protected-mode yes
requirepass 123456



# 运行
#启动容器时,运行的命令是什么 redis-server /etc/redis/redis.conf

docker run -id  -p 6379:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis  redis-server /etc/redis/redis.conf
       
    
# 在容器运行时,可以自己定制运行命名 举例:docker run -id centos:centos7 ls

  docker exec -it redis /bin/bash
  # 启动redis
     redis-cli
# 验证密码  
auth 123456 
# 查看字段
get name
    
# 远程链接redis操作

在这里插入图片描述

image-20240620220803389

2.3 nginx部署

image-20240620234932231

在这里插入图片描述

# 拉取nginx镜像
docker pull nginx


cd 
mkdir /root/html
cd /root/html/
vi index.html
# run起容器
# docker run -id --name nginx -p 80:80 nginx
    
# /usr/share/nginx/html
docker run -id --name nginx1 -p 8008:80 -v /root/html:/usr/share/nginx/html nginx
# 以后只需要修改宿主机的/root/html 路径,看到页面就是修改后的

;