Docker

1|0安装docker

使用阿里源安装docker镜像,注意需要服务器时间同步

sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo sudo yum makecache fast sudo yum -y install docker-ce sudo service docker start
systemctl enable docker.service

2|0镜像加速

阿里云容器镜像服务---->镜像加速器

sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://4gokpl83.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker

3|0镜像基础操作

搜索镜像

https://hub.docker.com/

docker search mysql

拉取镜像

docker pull mysql:5.7

可以在阿里云创建镜像仓库后进行推送和拉取镜像

docker pull registry.cn-shenzhen.aliyuncs.com/adif0028/nginx_php:74v3

查看镜像

docker images

删除镜像

docker rmi mysql:5.7

导出镜像

docker save zantao -o /opt/zantao.tar.g
查看镜像内容
tar -xf /opt/zantao.tar.gz -C /opt/
镜像导入
docker load < /opt/zantao.tar.gz
在宿主机基于容器 ID 提交为镜像
docker commit -m "nginx image" f0ca10c1f630 nginx:v1

4|0容器操作基础命令

命令格式:docker run [选项] [镜像名] [shell 命令] [参数]
 
启动的容器在执行完 shel 命令就退出了
docker run centos /bin/echo 'hello wold'
从镜像启动一个容器,会直接进入到容器,并随机生成容器 ID 和名称,退出容器后注销
docker run -it centos:7 bash

退出容器不注销

ctrl+p+q
显示正在运行的容器
docker ps
显示所有容器
docker ps -a
删除运行中的容器,即使容正在运行当中,也会被强制删除掉
 
docker rm -f 容器ID

删除所有容器

docker rm -f `docker ps -aq`
映射端口
随机映射端口
docker run -it -P nginx bash
指定端口映射
本地端口 81 映射到容器 80 端口
docker run -p 81:80 --name nginx-test-port1 nginx
一次性映射多个端口+协议
docker run -p 86:80/tcp -p 443:443/tcp -p 53:53/udp --name nginx-test-port5 docker.io/nginx
查看 Nginx 容器访问日志
docker logs nginx-test-port5
查看容器已经映射的端口
docker port nginx-test-port5

[root@mon02 ~]# docker port nginx-test-port5
53/udp -> 0.0.0.0:53
53/udp -> :::53
80/tcp -> 0.0.0.0:86
80/tcp -> :::86
443/tcp -> 0.0.0.0:443
443/tcp -> :::443

创建并进入容器,并自定义容器名称
docker run -it --name test-centos7 centos:7 bash
后台启动容器
docker run -d nginx
容器的启动和关闭
docker stop f821d0cd5a99 docker start f821d0cd5a99
批量关闭正在运行的容器
docker stop `docker ps -a -q`
进入到正在运行的容器
docker exec -it f438112a2717 bash
使用 nsenter 命令
nsenter 命令需要通过 PID 进入到容器内部,可以使用docker inspect 获取到容器的 PID
yum install util-linux
docker inspect -f "{{.State.Pid}}" centos-test3
nsenter -t 5892 -m -u -i -n -p
批量删除已退出容器
docker rm -f `docker ps -aq -f status=exited`
监控容器状态
docker stats
指定容器 DNS
Dns 服务,默认采用宿主机的 dns 地址
将参数配置在 docker 启动脚本里面 –dns=223.6.6.6
[root@docker-server1 ~]# docker run -it --rm --dns 223.6.6.6 centos:7 bash

5|0Docker 数据管理

数据卷
数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,
对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。
数据卷的使用类似于Linux下对目录进行的mount操作。
创建mysql容器并把数据映射到宿主机
docker run -d -e MYSQL_ROOT_PASSWORD=123456 -v /data/mysqldata:/var/lib/mysql mysql:5.7

查看数据

[root@mon02 Dockerfile]# ls /data/mysqldata/ auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
[root@mon02 Dockerfile]# docker exec -it 799b32b4fa12 bash root@799b32b4fa12:/# ls /var/lib/mysql auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem
映射的数据是相同的
[root@harbor nginx-1.22.0]# touch /data/mysqldata/1111111 root@87d52302135f:/var/lib/mysql# touch 222222222 root@87d52302135f:/var/lib/mysql# ls 1111111 ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys 222222222 ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem zentao auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem [root@harbor mysqldata]# ls 1111111 ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys 222222222 ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem zentao auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem
数据卷的特点及使用
1、数据卷是宿主机的目录或者文件,并且可以在多个容器之间共同使用。
2、在宿主机对数据卷更改数据后会在所有容器里面会立即更新。
3、数据卷的数据可以持久保存,即使删除使用使用该容器卷的容器也不影响。
4、在容器里面的写入数据不会影响到镜像本身。
更改容器启动空间大小
[Service] ... ExecStart=/usr/bin/dockerd --storage-driver devicemapper --storage-opt dm.loopdatasize=100G --storage-opt dm.loopmetadatasize=10G --storage-opt dm.fs=ext4 --storage-opt dm.basesize=30G ... DOCKER最大空间为100G,容器最大空间为30G

6|0白嫖镜像

 

7|0Docker 镜像制作

尽量选择小的基础镜像

如果是动态编译,需将类库一并打包到镜像

DockerFile
ADD #将当前目录下的文件加入到镜像内部,当文件是压缩包时会自动解压。 COPY #将当前目录下的文件加入到镜像内部,无解压功能。 ENV #环境变量,注入到镜像内部。 EXPOSE #容器默认暴露的端口。可以多次添加暴露多个端口 FROM #选择底层镜像,(选择父镜像)特殊情况选择:scratch(空镜像,形成系统或者直接拉起二进制时使用) LABEL #标签。做说明或者标识用 STOPSIGNAL #停止信号。优雅重启,用的不多 USER #容器内默认用户root,如果需要牢笼政策降级权限运行程序,则需要指定该项 VOLUME #创建容器时会创建相应卷。 WORKDIR #工作目录。如果工作目录不存在则创建 RUN #具体操作命令行. CMD #生成1号进程的默认命令 (/bin/sh -c) ENTRYPOINT #生成1号进程的默认命令 与cmd区别在于,当两个关键字同时出现时。cmd内容会作为参数传递给entrypoint (/start.sh) /start.sh /bin/sh MAINTAINER #作者信息

7|1Redis镜像制作(静态编译)

准备配置文件和脚本

[root@harbor Dockerfile]# vim /project/Dockerfile/redis.conf daemonize yes
[root@harbor Dockerfile]# vim /project/Dockerfile/start.sh #!/bin/bash redis-server /data/redis.conf tail -f /dev/null

编写Dockerfile

[root@harbor Dockerfile]# vim /project/Dockerfile/Dockerfile FROM centos:7 MAINTAINER panda-wei WORKDIR /data COPY redis.conf /data COPY start.sh /data ADD redis-5.0.14.tar.gz /data RUN yum install -y gcc gcc-c++ make && \ cd redis-5.0.14 && \ make && make install && \ chmod a+x /data/start.sh && \ yum remove -y gcc gcc-c++ make FROM ubuntu WORKDIR /data COPY --from=0 /usr/local/bin/* /usr/local/bin/ COPY --from=0 /data/start.sh /data COPY --from=0 /data/redis.conf /data EXPOSE 6379 CMD ["/data/start.sh"] ENTRYPOINT ["/bin/sh","-c"]

制作镜像

[root@harbor Dockerfile]# docker build -t redis:v1 .

测试镜像是否可用

docker run -d redis:v1 docker exec -it 72319623d7b8 bash root@72319623d7b8:/data# redis-cli 127.0.0.1:6379> ping PONG

7|2Nginx镜像制作(动态编译)

FROM centos:7 MAINTAINER panda-wei WORKDIR /data COPY nginx.conf /usr/local/nginx/conf/nginx.conf COPY start.sh /data ADD nginx-1.22.0.tar.gz /data RUN yum install gcc zlib zlib-devel pcre pcre-devel openssl openssl-devel -y > /dev/null && \ groupadd -g 88 nginx && useradd -g nginx -M -s /sbin/nologin -u 88 nginx && \ cd /data/nginx-1.22.0 && \ CONFIG="\ --user=nginx \ --group=nginx \ --prefix=/usr/local/nginx \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_stub_status_module \ --with-http_sub_module \ --with-http_ssl_module \ --with-pcre \ --with-stream \ " \ && ./configure $CONFIG && make && make install && \ chmod a+x /data/start.sh FROM registry.cn-shenzhen.aliyuncs.com/adif0028/centos:v7 COPY --from=0 /lib /lib COPY --from=0 /lib64 /lib64 COPY --from=0 /usr/local/nginx /usr/local/nginx WORKDIR /data COPY --from=0 /data/start.sh /data/start.sh RUN groupadd -g 88 nginx && useradd -g nginx -M -s /sbin/nologin -u 88 nginx && \ mkdir /usr/local/nginx/conf/vhosts && \ sed -i '$i include vhosts/*.conf;' /usr/local/nginx/conf/nginx.conf && \ ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx && \ mkdir /var/log/nginx &&\ chown nginx.nginx -R /var/log/nginx EXPOSE 80 CMD ["/data/start.sh"] ENTRYPOINT ["/bin/sh","-c"]
docker run -d -p 80:80 nginx:v1

8|0跨主机容器间通信macvlan

准备两台docker服务器进行测试

在两台虚拟机进行

创建macvlan网络,可以自定义ip地址

docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=ens33 macvlan_1

设置eth33的网卡为混杂模式

ip link set eth1 promisc on

创建使用macvlan网络的容器

docker run -it --network macvlan_1 --ip=10.0.0.200 centos:7 bash
docker run -it --network macvlan_1 --ip=10.0.0.201 centos:7 bash

测试是否相通

[root@b90803e9fbf1 /]# ping 10.0.0.201 PING 10.0.0.201 (10.0.0.201) 56(84) bytes of data. 64 bytes from 10.0.0.201: icmp_seq=1 ttl=64 time=0.393 ms 64 bytes from 10.0.0.201: icmp_seq=2 ttl=64 time=0.279 ms

9|0Docker Compose 单机编排

安装

mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose

本次使用版本

[root@mon02 compose]# docker-compose -version docker-compose version 1.24.0, build 0aa59064
mkdir -p /project/compose
官方二进制下载地址:

使用Compose部署禅道

编写yml文件

[root@mon02 compose]# vim docker-compose.yml version: '3' services: db: image: mysql:5.7 container_name: mysql restart: always tty: true environment: MYSQL_ROOT_PASSWORD: "123456" volumes: - /data/mysqldata:/var/lib/mysql networks: - zentao web: image: zentao:v1 container_name: zentao restart: always tty: true depends_on: - db ports: - 80:80 networks: - zentao volumes: mysqldata: networks: zentao:

后台启动容器

docker-compose up -d

进入容器后修改Nginx和php配置文件

[root@mon02 compose]# docker exec -it zentao bash [root@4f50786b50d4 data]# vi /usr/local/nginx/conf/nginx.conf server { root /data/zentaopms/www; [root@4f50786b50d4 data]# vi /usr/local/php/etc/php.ini session.save_path = "/tmp" [root@4f50786b50d4 data]# nginx -s reload [root@4f50786b50d4 data]# /etc/init.d/php-fpm restart

10|0harbor私有镜像平台

服务端配置至少 2核4G

注意版本,本次使用版本:

harbor v2.5.2 docker-compose v2.5.1

在harbor官网下载相应版本 https://goharbor.io/

使用手册 https://goharbor.io/docs/2.6.0/install-config/

设置服务端hostname

hostnamectl set-hostname harbor

服务端安装harbor

tar -xf harbor-offline-installer-v2.5.2.tgz -C /opt

进入目录

cd /opt/harbor/

修改配置文件

cp harbor.yml.tmpl harbor.yml vim harbor.yml hostname: 192.168.88.20 #不需要https时将以下注释 # https related config #https: # # https port for harbor, default is 443 # port: 443 # # The path of cert and key files for nginx # certificate: /your/certificate/path # private_key: /your/private/key/path harbor_admin_password: 123456

本次使用http,将配置文件ip设置为服务器ip

[root@harbor harbor]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://4gokpl83.mirror.aliyuncs.com"], "insecure-registries" : ["192.168.88.20"] }

修改config.json文件

[root@harbor harbor]# vim ~/.docker/config.json { "auths": { "registry.cn-guangzhou.aliyuncs.com": { "auth": "ZndlZnczMzM6d2VpMTY0MjI5ODQ0OQ==" } } }

重启docker

systemctl restart docker

安装harbor,可以多次运行脚本

[root@harbor harbor]# ./install.sh

当修改harbor配置时可以使用 ./prepare 脚本

查看harbor是否正常运行

[root@harbor harbor]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cc9ddd808b15 goharbor/harbor-jobservice:v2.5.2 "/harbor/entrypoint.…" 20 minutes ago Up 19 minutes (healthy) harbor-jobservice 94549eac7cc9 goharbor/nginx-photon:v2.5.2 "nginx -g 'daemon of…" 20 minutes ago Up 19 minutes (healthy) 0.0.0.0:80->8080/tcp, :::80->8080/tcp nginx d068a04f5547 goharbor/harbor-core:v2.5.2 "/harbor/entrypoint.…" 20 minutes ago Up 20 minutes (healthy) harbor-core d0a4d14ae7d3 goharbor/harbor-registryctl:v2.5.2 "/home/harbor/start.…" 20 minutes ago Up 20 minutes (healthy) registryctl 4dca4f8265b6 goharbor/harbor-db:v2.5.2 "/docker-entrypoint.…" 20 minutes ago Up 20 minutes (healthy) harbor-db c7313b895191 goharbor/harbor-portal:v2.5.2 "nginx -g 'daemon of…" 20 minutes ago Up 20 minutes (healthy) harbor-portal b139558eeb7c goharbor/redis-photon:v2.5.2 "redis-server /etc/r…" 20 minutes ago Up 20 minutes (healthy) redis 6f977686f776 goharbor/registry-photon:v2.5.2 "/home/harbor/entryp…" 20 minutes ago Up 20 minutes (healthy) registry 87ad2662cda7 goharbor/harbor-log:v2.5.2 "/bin/sh -c /usr/loc…" 20 minutes ago Up 20 minutes (healthy) 127.0.0.1:1514->10514/tcp harbor-log

登录web界面新建项目

 使用http时在客户端修改配置

[root@harbor-agent ~]# vim /etc/docker/daemon.json { "registry-mirrors": ["https://4gokpl83.mirror.aliyuncs.com"], "insecure-registries" : ["192.168.88.20"] }
systemctl restart docker.service

修改镜像名

docker tag bitnami/redis 192.168.88.20/redis/redis:v1

客户端登录

docker login 192.168.88.20

推送镜像

docker push 192.168.88.20/redis/redis:v1

 


__EOF__

本文作者panda-wei
本文链接https://www.cnblogs.com/panda-wei/p/16851980.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   kivtx  阅读(35)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示