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
创建镜像容器
[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联合文件
[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目录(内核文件保存位置,不允许修改),并且将用户设置为数字
commit
commit 用法:
根据基础镜像创建容器 c0 ,在c0容器中安装应用,如httpd,然后crtl+p+q 退出容器
使用commit指令将容器c0制作成镜像
docker commit c0 centos:httpd