docker联合文件+link+commit

docker基础回顾

创建容器:docker run -it --name a1 centos:latest /bin/bash

查看容器:docker ps(查看正在up的容器)

docker ps -a(查看所有的容器)

切回宿主机:ctrl p q

启动容器:docker start a1

停止容器:docker stop a1

删除容器:docker rm a1

docker rm -f a1(强制删除容器)

如果容器正在运行,容器是无法删除的,如果容器没有删除,对应的镜像也无法删除

镜像的迁移:

save:docker save -o centos.tar centos:latest

load:docker load -i centos.tar

生成镜像:

export(通过容器生成tar包):docker export -o centos_httpd.tar a1

import(通过tar引入镜像):docker import -m httpd centos_httpd.tar centos:httpd

获得镜像的ip地址:

1、进入镜像的bash:yum -y install iprouter,net-tools

2、使用exec指令:dockers exec a1 yum -y install iprouter,net-tools

docker exec a1 ip add

3、直接使用inspect命令:docker inspect a1

端口映射 -p:

docker run -it --name a2 -p80:80 centos:latest /bin/bash

docker run -it --name a2 -p80 centos:latest /bin/bash 宿主会指定一个大于32767的端口给容器

docker ps -a 查看实际给予的端口

docker run -it --name a2 -p10.0.0.101::80 centos:latest /bin/bash

数据持久化:

docker run -it --name a2 -v /zhenji:/rongqi centos:latest /bin/bash

使用docker部署考试系统

  # 1、将资源上传到服务器
  [root@docker ~]# yum -y install unzip
  [root@docker ~]# rz -E
  rz waiting to receive.
  [root@docker ~]# unzip project_exam_system.zip 
  ​
  # 2、创建基础镜像
  [root@docker ~]# systemctl start docker
  [root@docker ~]# docker pull centos
  Using default tag: latest
  latest: Pulling from library/centos
  Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
  Status: Image is up to date for centos:latest
  docker.io/library/centos:latest
  ​
  # 3、在容器中修改yum源
  [root@docker ~]# docker run -it --name a0 centos:latest /bin/bash
  [root@d1d92bed0d9a /]# rm -rf /etc/yum.repos.d/*
  [root@d1d92bed0d9a /]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
    % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                   Dload  Upload   Total   Spent    Left  Speed
  100  2495  100  2495    0     0   5898      0 --:--:-- --:--:-- --:--:--  5898
  [root@d1d92bed0d9a /]# yum clean all && yum makecache 
  ​
  # 4、在容器中安装epel
  [root@d1d92bed0d9a /]# yum -y install epel-release
  ​
  # 5、在容器中安装nginx
  [root@d1d92bed0d9a /]# yum -y install nginx
  ​
  # 6、ctrl p q退出容器
  [root@d1d92bed0d9a /]# [root@docker ~]# 
  ​
  # 7、导出tar包
  [root@docker ~]# docker export -o centos_nginx.tar a0
  [root@docker ~]# ls
  anaconda-ks.cfg         centos.tar      project_exam_system.sql        yum_httpd.tar
  application.properties  centos_yum.tar  Project_ExamSystem-V1.0.0.war
  centos_nginx.tar        dist            project_exam_system.zip
  ​
  # 8、引入tar包,成为镜像
  [root@docker ~]# docker import -m "nginx" centos_nginx.tar centos:nginx
  sha256:a0a4655eb590b16aace6c33d78862992ccdf615f1d517d236d173ff501086ff8
  ​
  # 9、查看镜像
  [root@docker ~]# docker images
  REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
  centos       nginx     a0a4655eb590   18 seconds ago   366MB
  centos       httpd     92dfb2054854   3 days ago       310MB
  centos       yum       d79f0f2ff79e   3 days ago       260MB
  mysql        latest    a82a8f162e18   4 weeks ago      586MB
  centos       latest    5d0da3dc9764   2 years ago      231MB
  ​
  # 10、删除容器
  [root@docker ~]# docker rm -f a0
  a0
  ​
  # 11、创建新的容器,在创建的同时指定端口,以及挂载目录
  [root@docker ~]# docker run -it --name a0 -p80:80/tcp -v /opt/:/usr/share/nginx/html centos:nginx /bin/bash
  ​
  # 12、在容器内部启动nginx服务
  [root@8dea218de2f7 /]# nginx
  ​
  # 13、curl p q退出镜像
  [root@8dea218de2f7 /]# [root@docker ~]# 
  [root@docker ~]# ls /opt
  containerd
  ​
  # 14、在宿主机上把dist目录中的文件复制到opt目录下
  [root@docker ~]# cp -r dist/* /opt/
  [root@docker ~]# ls /opt/
  assets  containerd  favicon.ico  index.html
  [root@docker ~]# curl localhost
  <!DOCTYPE html>
  <html lang="en">
    <head>
      <meta charset="UTF-8">
      <link rel="icon" href="/favicon.ico">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Vite App</title>
      <script type="module" crossorigin src="/assets/index-C4kAShR5.js"></script>
      <link rel="stylesheet" crossorigin href="/assets/index-CSz7ARPP.css">
    </head>
    <body>
      <div id="app"></div>
    </body>
  </html>

# 15、浏览器查看并登录

mysql容器

拉取mysql镜像

[root@docker ~]# docker pull mysql

创建镜像容器

# -d 后台运⾏,并输出hashcode
# -e MYSQL_ROOT_PASSWORD=root 设置mysql密码
# -p 映射3306端⼝

[root@docker ~]# docker run -d --name m0 -e MYSQL_ROOT_PASSWORD=root -p3306:3306 mysql:latest 
788719b5dc2838056cec15cf13d9cc733ba91692948482b68e163bf77ff46606

管理mysql

[root@docker ~]# docker exec -it m0 mysql -uroot -proot 
mysql: [Warning] Using a password on the command line interface can be insecure.

让容器时间和宿主机时间一致

让容器共享宿主的/etc/localtime,共享了本地时间

[root@docker ~]# docker run -it --name c2 -v /etc/localtime:/etc/localtime centos:latest /bin/bash
[root@8364f7784141 /]# date
Mon Aug 26 14:40:02 CST 2024

exec

exec:在容器外执行容器内部的命令
注意:容器内部已经安装的指令可执行,否则无法执行

link

link:容器的IP地址不稳定

--link  容器名:别名

docker容器的IP地址是不固定的,如果要作为服务器使用,就必须能够直接访问服务,不能直接使用ip,为容器设置域名,做端口映射也能保证,确定是一旦停用之后端口被占用,就无法再次启动了

docker run  --link 容器的名称或者是id:自定义域名

被link容器必须处于启动状态,否则当前容器无法启动

创建一个容器m0:

[root@docker ~]# docker run -d --name m0 -e MYSQL_ROOT_PASSWORD=root mysql:latest  
57b38baa205c6315f244f4e74253f53f608894b86cd5226f6d88a5217da01559
[root@docker ~]# docker inspect m0
                    "IPAddress": "172.17.0.2",

 

创建一个容器c0:

[root@docker ~]# docker run -it --name c0 --link m0:mysqldb centos:latest /bin/bash
[root@619af276e666 /]# ping mysqldb
PING mysqldb (172.17.0.2) 56(84) bytes of data.
64 bytes from mysqldb (172.17.0.2): icmp_seq=1 ttl=64 time=0.118 ms

[root@619af276e666 /]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.2    mysqldb 57b38baa205c m0
172.17.0.3    619af276e666

创建一个容器占用172.17.0.2:

[root@docker ~]# docker stop m0
m0
[root@docker ~]# docker run -it --name c1 centos:latest /bin/bash
[root@b8465a9e13ca /]# [root@docker ~]# 
[root@docker ~]# docker inspect c1

                   "IPAddress": "172.17.0.2",


[root@docker ~]# docker start m0
m0
[root@docker ~]# docker inspect m0
 "IPAddress": "172.17.0.4",

在c0容器ping别名:

[root@docker ~]# docker attach c0
[root@619af276e666 /]# ping mysqldb
PING mysqldb (172.17.0.4) 56(84) bytes of data.
64 bytes from mysqldb (172.17.0.4): icmp_seq=1 ttl=64 time=0.105 ms

每次启动都修改了/etc/hosts文件:
[root@619af276e666 /]# cat /etc/hosts
127.0.0.1    localhost
::1    localhost ip6-localhost ip6-loopback
fe00::0    ip6-localnet
ff00::0    ip6-mcastprefix
ff02::1    ip6-allnodes
ff02::2    ip6-allrouters
172.17.0.4    mysqldb 57b38baa205c m0
172.17.0.3    619af276e666

容器之间的依赖:

[root@docker ~]# docker ps --all
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS         PORTS                 NAMES
b8465a9e13ca   centos:latest   "/bin/bash"               5 minutes ago    Up 5 minutes                         c1
619af276e666   centos:latest   "/bin/bash"               9 minutes ago    Up 9 minutes                         c0
57b38baa205c   mysql:latest    "docker-entrypoint.s…"   11 minutes ago   Up 4 minutes   3306/tcp, 33060/tcp   m0
[root@docker ~]# docker stop c0 c1 m0
c0
c1
m0
先启动主动依赖容器,无法启动,提示link的容器没有启动:

[root@docker ~]# docker start c0
Error response from daemon: Cannot link to a non running container: /m0 AS /c0/mysqldb
Error: failed to start containers: c0

先启动被依赖的容器:

[root@docker ~]# docker start m0
m0

docker联合文件

1.在docker daemo初始状态(没有镜像的时候) /var/lib/docker不存在
2.当docker daemon服务器启动,会⾃动创建docker⽬录
3.在没有镜像的情况下,查看overlay2这个⽬录是只有两个⽂件, 管道⽂件 ,l⽬录(管理镜像和容器的软连接的⽬录)
4.当我们pull⼀个镜像之后 /var/lib/docker/overlay2下就有⼀个新的⽬录,这个⽬录就是centos的基础⽬录,这个新的⽬录就是镜像,就是不可读的层
5.当我们使⽤这个镜像创建⼀个容器,在overlay2会添加2个⽬录, ⼀个是init⽬录,另外⼀个⽬录就是容器的可写层,⽤户对系统的修 改都在可写层中进⾏
[root@docker ~]# rm -rf /var/lib/docker/
[root@docker ~]# systemctl start docker.service 
[root@docker ~]# cd /var/lib/docker
[root@docker docker]# ls
buildkit    engine-id  network   plugins   swarm  volumes
containers  image      overlay2  runtimes  tmp
[root@docker docker]# cd
[root@docker ~]# ls /var/lib/docker
buildkit    engine-id  network   plugins   swarm  volumes
containers  image      overlay2  runtimes  tmp
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@docker ~]# docker ps --all
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@docker ~]# ls /var/lib/docker/overlay2/
backingFsBlockDev  l
[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@docker ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
centos       latest    5d0da3dc9764   2 years ago   231MB
[root@docker ~]# ls /var/lib/docker/overlay2/
a18e68f74cffffa32faa67287f1f94e2ecfb722238accbfa0027a9b79edf52ad  l
backingFsBlockDev
[root@docker ~]# ls /var/lib/docker/overlay2/a18e68f74cffffa32faa67287f1f94e2ecfb722238accbfa0027a9b79edf52ad/
diff  link
[root@docker ~]# ls /var/lib/docker/overlay2/a18e68f74cffffa32faa67287f1f94e2ecfb722238accbfa0027a9b79edf52ad/diff/
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@docker ~]# docker run -it --name c0 centos:latest /bin/bash
[root@55e37d268947 /]# [root@docker ~]# 
[root@docker ~]# ls /var/lib/docker/overlay2/
49e616b9f8d7825d89e09b750e42f4452c5bed4cf7160ceb00ea9a9a45715db6
49e616b9f8d7825d89e09b750e42f4452c5bed4cf7160ceb00ea9a9a45715db6-init
a18e68f74cffffa32faa67287f1f94e2ecfb722238accbfa0027a9b79edf52ad
backingFsBlockDev
l
[root@docker ~]# ls /var/lib/docker/overlay2/49e616b9f8d7825d89e09b750e42f4452c5bed4cf7160ceb00ea9a9a45715db6
diff  link  lower  merged  work
[root@docker ~]# docker exec c0 dd if=/dev/zero of=/zhangsanlisi.txt bs=10M count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB, 1000 MiB) copied, 0.763067 s, 1.4 GB/s
[root@docker ~]# ls /var/lib/docker/overlay2/49e616b9f8d7825d89e09b750e42f4452c5bed4cf7160ceb00ea9a9a45715db6/merged/
bin  home   lost+found  opt   run   sys  var
dev  lib    media       proc  sbin  tmp  zhangsanlisi.txt
etc  lib64  mnt         root  srv   usr

基础镜像制作

在最小安装的主机上操作:

排除进程目录(/proc/)和sys目录(内核文件保存位置,不允许修改),并且将用户设置为数字

tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7.tar /
将项目移动到docker主机上
scp centos7.tar root@docker主机的ip:~
docker主机上操作:
查看tar包 ls
加载镜像
docker import -m "说明0" centos7.tar me:me00
查看镜像 docker images
创建容器
docker run -it --name c00 me:me00 /bin/bash

commit

commit就相当于export和import

commit 用法:

docker commit [OPTIONS] CONTAINER  [REPOSITORY[:TAG]]

根据基础镜像创建容器 c0 ,在c0容器中安装应用,如httpd,然后crtl+p+q 退出容器

使用commit指令将容器c0制作成镜像

docker  commit  c0  centos:httpd

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值