114、Docker国内源配置 镜像相关操作、容器相关操作、应用部署、迁移备份

89 阅读11分钟

今日内容概要

  • Docker国内源配置
  • 镜像相关操作
  • 容器相关操作
  • 应用部署
  • 迁移备份

今日内容详细

Docker国内源配置

1.镜像:一堆文件
	1.目前从远程仓库下载的:https://hub.docker.com/
    -镜像有很多人提供:官方提供,第三方提供
    -镜像-->更新-->Tag不同版本
			-centos:latest 最新
		-docker pull 能找到,仓库中有才行
    -忘掉:docker search 名字

2.容器:镜像运行后的--->当成一个简洁的操作系统即可

docker操作

-docker -v  查看版本
-systemctl status docker 查看docker状态
-systemctl start docker 启动docker
-systemctl stop docker  停止docker
-docker info  查看docker更详细信息

docker pull 设置国内镜像站

1.远程仓库,下载镜像 ,国外:https://hub.docker.com--->下载比较慢-->设置国内镜像站
	-https://cr.console.aliyun.com/cn-shanghai/instances/mirrors
2.docker安装后会有 /etc/docker 文件夹
  vim /etc/docker/daemon.json
  {
    "registry-mirrors": ["https://x1566319.mirror.aliyuncs.com"]
  }
  sudo systemctl daemon-reload
  sudo systemctl restart docker

镜像相关操作

1.查找镜像
	docker search 镜像名称  
	ps:建议去hub.docker.com 直接搜,更直观
    
2.拉取镜像,指定标签 tag
	docker pull centos:7
	ps:如果不指定标签,会下载最新
  docker pull centos
  docker pull centos:latest
        
3.查看本地镜像
	docker images  # 等同于 docker image ls
    
4.删除镜像
	docker rmi 镜像ID   # 可以同时删多个

5.删除所有镜像
	# 思路:查出所有镜像的id号:docker images -q
	docker rmi `docker images -q`

容器相关操作

基本操作

# 把镜像运行成容器,并且一个镜像,可以运行出多个容器

1.查看正在运行的容器
	docker ps
2.查看所有容器
	docker ps -a
3.查看最后一次运行的容器
 	docker ps -l
    
4.启动停止的容器
	docker start id/名字

6.停止运行的容器
	docker stop id/名字

7.停止所有在运行的容器
	docker stop `docker ps -q`

run运行容器

1.运行容器(其实是两步:创建容器:create,运行容器:run)
	1.如果容器没有创建,直接执行run,就会创建并运行,所以你只需要会run就行了
    run 的时候,有很多参数
      -i:表示运行容器
      
      -t:表示容器启动后会进入容器命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
      -d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)
      --name :为创建的容器命名,如果不写,随机生成一个名字
      -v:表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
      -p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
		
2.守护式方式创建容器:docker run -di --name=容器名称 镜像名称:标签
	1.创建一个python3.9容器--->不进入
	docker run -id --name python3 python:3.9
	2.交互式方式创建容器
  docker run -it --name=容器名称 镜像名称:标签 /bin/bash

3.需求:启动一个centos容器,名字叫mycentos,并且进入
  docker run -it --name=mycentos centos:7
  yum install vim -y  # 在容器中装了vim软件
  exit  # 退出,容器停止了

重要

docker5.png

1.如果是it进入容器--->容器会开启一个进程处理:/bin/bash   python  如果在容器中敲exit退出了这个进程,这个进程就结束了--->容器会停止--->容器要运行,必须有个前台进行在运行,并且是夯住(阻塞)的--->否则容器就停了

2.如果是id进入容器--->前台(python)进程在运行--->容器一直不停--->exec进入了--->/bin/bash--->创建出bash交互--->(敲python)--->exit()--->退出(python)--->exit--->退出bash

3.启动一个centos容器,名字叫mycentos,不进入
	docker run -id --name mycentos centos:7 

4.启动容器(之前停止了)
	docker start mycentos

5.进入到容器内部(本质是让容器执行命令)
  docker exec 容器id 命令
  docker exec f82e8578b9b1 ls
  docker exec -it  f82e8578b9b1 /bin/bash  # 进入到容器内部

6.登录守护式容器方式:
  docker exec -it 容器名称 (或者容器ID)  /bin/bash
  docker exec -it  f82e8578b9b1 /bin/bash  # 进入到容器内部

7.退出
	exit
  
  """
[root@10 docker]# docker run -id --name python3.9 python:3.9.17
4327ba6c7b8fa8c38efdab9d18a6ec124d89bd38fa55c122a6393f49347d4d66
[root@10 docker]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED              STATUS                        PORTS     NAMES
4327ba6c7b8f   python:3.9.17   "python3"     About a minute ago   Up About a minute                       python3.9
[root@10 docker]# docker exec -it 4327ba6c7b8f /bin/bash
root@4327ba6c7b8f:/# python
Python 3.9.17 (main, Jul 28 2023, 05:30:48)
[GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
root@4327ba6c7b8f:/# exit
exit
[root@10 docker]#
  
  """

-v目录映射

docker6.png

1.我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
2.创建容器,添加-v参数 ,后边为 宿主机目录:容器目录,
	例如:
  dock er run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
	ps:如果你共享的是多级的目录,可能会出现权限不足的提示。	
  	这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

3..好处是,后期咱们部署django项目
		有个django容器,做好映射,代码放在宿主机上即可,以后更新了代码,只要重启容器,代码就是最新了
    运行mysql容器--->mysql配置文件放在宿主机上做好映射
    mysql容器--->表数据,放到容器中--->如果删了容器--->数据库全没了
    表数据,放在宿主机上--->把容器删除--->表数据还在---->再启动一个容器做好映射--->数据都还在
    
4.-v参数:目录映射
docker run -id --name=lqz -v /home/lqz:/lqz centos:7
以后无论在宿主机还是容器中修改当前目录下的文件,都会相互影响
1.运行容器并做映射(宿主机-->有docker软件)
docker run -id --name=lqzcentos  -v /home/lqz/:/home/ centos:7
#docker run -id --name=lqzcentos  -v /home/lqz/aa.txt:/aa.txt centos:7
2.进入到容器内部
docker exec -it lqzcentos /bin/bash
3.到home路径下
cd /home
4.容器内部修改文件--->会影响外部
5.外部修改文件--->影响内部

-p 端口映射

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

2.
# 启动mysql容器 启动的mysql的root密码是123456
docker run -id --name=mysql -p 3307:3306  -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker exec -it mysql /bin/bash  # 进入容器

3.查看本机3307端口占用情况:netstat -nlp |grep 3307 
  # 以后访问宿主机3307端口就等于访问容器的3306端口
[root@10 ~]# docker run -id --name=mysql -p 3307:3306  -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
3126cb85ee839bcc063db98a50e93002101a7bb20daf55a801a4c576eb41b6dd
[root@10 ~]# docker ps
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS          PORTS                                                  NAMES
3126cb85ee83   mysql:8.0       "docker-entrypoint.s…"   12 seconds ago   Up 12 seconds   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mysql
[root@10 ~]# docker exec -it mysql /bin/bash
bash-4.4# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.34 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases
    -> ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)
mysql>...

# 本地navicate可以连接:用户:root 密码:123456 host:10.0.0.128
# mysql连接: 
na@Nas-MacBook-Pro  ~  mysql -h 10.0.0.128 -uroot -P 3307 -p
Enter password:123456

容器剩余内容

1.启动容器
	docker start 容器id
2.停止容器
	docker stop 容器id

3.文件拷贝(宿主机执行)
	# 容器的文件copy到宿主机上(不是在容器内执行)
    docker cp 容器名称:容器目录 需要拷贝的文件或目录
    docker cp  f6ce8be027de:/aa.txt /aa.txt
    """
    docker cp centos:/cx.txt ./cx.txt
    """
    # 宿主机的文件copy到容器中
    docker cp 需要拷贝的文件或目录 容器名称:容器目录
    docker cp /home/lqz/aa.txt f6ce8be027de:/aa.txt
    """
    docker start centos
    docker ps
    docker cp /home/nana/cx.txt fe917a71d809:/cx.txt
    docker exec -it centos /bin/bash
    ls
    """

4.查看容器IP地址    
	docker inspect 容器名称  # 查看容器的详细描述,很多(IPAddress就在里面)
  docker inspect 7f412212f708 --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
 """
 [root@10 ~]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
172.17.0.7
 """
  
5.在多个容器之间是可以ping通的(容器和宿主机也可以)
	centos:172.17.0.3
	mysql:172.17.0.2
  """
  [root@10 ~]# docker inspect mysql
  [root@10 ~]# ping 172.17.0.7
  [root@10 ~]# docker run -it centos:7
	[root@d044ab7d29d9 /]# ping 172.17.0.7
  """
6.删除容器(删除已停止的容器)
		docker rm 容器id  
    docker rm `docker ps -a -q`
    
7.无状态的服务(在容器中尽量运行无状态的服务)
    -mysql reids   有状态,运行过程中产生数据,保存,容器删除,数据就没了
    -uwsgi+django  无状态的服务

应用部署

mysql部署

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

2.需要做目录和端口映射
  #做目录映射:data文件,配置文件
  # 创建文件夹
  mkdir /home/mysql
  mkdir /home/mysql/conf.d
  mkdir /home/mysql/data/
  vim /home/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 /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7      
        
     
3.创建库,创建表,插入数据

4.关闭容器,删除容器,myslq的容器没了,但是数据在宿主机上放着
 docker stop mysql2
 docker rm mysql2
5.再运行起一个容器,做好目录映射,数据都回来了
  docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 3307:3306 --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 

redis部署

1.拉取redis镜像
	docker pull redis
2.
  mkdir /root/data
  vim /root/redis.conf

  bind 0.0.0.0
  daemonize NO
  protected-mode yes
  requirepass 123456

3.运行
  docker run -id  -p 6380:6379 --name redis -v /root/redis.conf:/etc/redis/redis.conf -v /root/data:/data redis  redis-server /etc/redis/redis.conf
  """
  docker exec -it redis /bin/bash
  redis-cli
  """     
4.远程链接redis操作
	1.navicate
  2.cmd:redis-cli -h 10.0.0.1 -p 6380
  			auth 123456

nginx部署

1.拉取nginx镜像
docker pull nginx

2.run起容器
	docker run -id --name nginx -p 8080:80 nginx
	cd /usr/share/nginx/html
	echo 'nana is ok' >index.html
  ps:浏览器:127.0.0.1:8080
4.
docker run -id --name nginx1 -p 8088:80 -v /root/html:/usr/share/nginx/html nginx

5.以后只需要修改宿主机的/root/html 路径,看到页面就是修改后的
	cd /root/html
  vim index.html
  

迁移备份

1.镜像从哪来的?
  1 docker pull 拉的
  2 通过容器打包成镜像
  3 Dockerfile构建
    
2.容器保存为镜像
  -运行一个centos容器
  	docker run -id --name centos_vim centos:7
  -在容器中装vim
    docker exec -it a6e240 /bin/bash
    yum install vim -y

  -把容器做成镜像(centos+vim)
  	docker commit centos_vim centos_vim_image

  -把centos_vim 容器删除
  	docker rm centos_vim
  -基于新构建的镜像,运行成容器
  	docker run -id --name centos_vim centos_vim_image:latest
  -进入到容器中,查看,软件都在
  	docker exec -it id号 /bin/bash

3.镜像备份和恢复
  docker save -o centos_vim_image.tar centos_vim_image
  -删除容器,删除镜像
  -把备份的镜像恢复
  docker load -i centos_vim_image.tar
[root@10 ~]# docker run -id --name centos_vim centos:7
984d320ea53754a51053433aab69ec782977972652c909f84dbd62c52073808a
[root@10 ~]# docker ps
[root@10 ~]# docker exec -it centos_vim /bin/bash
[root@984d320ea537 /]# yum install vim -y
[root@984d320ea537 /]# exit
[root@10 ~]# docker commit centos_vim centos_vim_image
sha256:ff7c265da9ce36e306a9168f99c8c166046c0d8a87d0a87e0bbc10626c2fc457
[root@10 ~]# docker images
[root@10 ~]# docker rm -f `docker ps -a -q`
[root@10 ~]# docker ps
[root@10 ~]# docker images
[root@10 ~]# docker run -id --name centos_vim centos_vim_image:latest
89b25f9cdb1100028b53c5ad73da1fce0331da74666fd82d3ebf0f43ffcd6b45
[root@10 ~]# docker exec -it centos_vim /bin/bash