1.服务器配置
1.1centos7 系统的安装
centos-7-isos-x86_64安装包下载)
- VMware安装
- 自定义配置
-
选择对应的系统镜像
-
一般选择内核4核、内存8g、硬盘80g
-
相关配置
1.2.网络配置
1.2.1查看win电脑虚拟机VMnet8的ip
使用ipconfig
查看虚拟机的ip
1.2.2配置虚拟机VMnet8的ip
ip地址与默认网关的最后一位一般设置位1或2此处配置的ip地址很重要,后续配置的centos的ip地址,是该ip的子网 192.198.192.x x一般非0、1、2、255等特殊DNS1:8.8.8.8
DNS2:8.8.4.4
1.2.3 centos中配置
配置网络配置文件
cd /etc/sysconfig/network-scripts/ 进入配置文件夹ls 查看相关文件vi ifcfg-ens33 编辑配置文件(i进入编写模式 esc退出编写模式 :wq保存并退出)
ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=noBOOTPROTO=static # 由原来的dhcp改成staticDEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=cfbd5cd7-fa17-48e6-9d13-715f33e1f08d
DEVICE=ens33ONBOOT=yes # 由原来的no改成yes
IPADDR=192.198.192.xxx # 要设置当前主机的IP (xxx非0、1、2、255)
GATEWAY=192.198.192.2 # 网关
NETMASK=255.255.255.0 # 掩码
DNS1=8.8.8.8 # NDS服务器
DNS2=8.8.4.4 # NDS服务器
开启网络服务
service network restart
重启网络服务
systemctl restart network
检测配置清空
ping www.baidu.com 是否能ping通
1.2.4 系统初始化
-
关闭selinux
-
查看状态
getenforce
-
临时关闭
setenforce 0
-
永久关闭
vi /etc/selinux/config
# 设置为disabled SELINUX=disabled
-
-
防火墙
-
查看防火墙状态
systemctl status firewalld
-
关闭
systemctl stop firewalld
-
关闭开机启动防火墙
systemctl disable firewalld
-
-
net-tools
yum install net-tools -y
-
openssh-server
yum install openssh-server -y
systemctl start sshd.service
systemctl enable sshd.service
ssh便于xshell连接
-
centos常用工具包
yum install -y wget bash-completion vim lrzsz wget expect net-tools nc nmap tree dos2unix htop iftop iotop unzip telnet sl psmisc nethogs glances bc ntpdate openldap-devel
1.3.xshell连接centos虚拟机
XSHELL
输入待连接的虚拟机ip即可
2.Docker的安装
2.1安装docker-ce社区版
-
配置repo源
curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum clean all && yum makecache
-
查看可下载版本
yum list docker-ce --showduplicates | sort -r
-
安装
# 最新版 yum install -y docker-ce# 指定版本 yum install -y docker-ce-23.0.6
2.2 启动docker-ce社区版
-
设置开机启动
systemctl enable docker
-
启动docker
systemctl start docker
systemctl restart docker
-
停止docker
systemctl stop docker
-
其他
## 查看docker信息 docker version## 查看docker信息 docker info## docker-client which docker## docker daemon ps -ef |grep docker
2.3★★★Docker概述★★★
docker的方式,创建的容器不是完整的操作系统,而是充分利用宿主机内核+进程,只是创建了一些必备的资源。
-
DockerHub,远程镜像仓库。https://hub.docker.com/
仓库中有官方的一些镜像文件,也有开发者自定义的镜像文件。
-
Images,本地镜像仓库。
可以去远程仓库下载镜像到本地仓库,后续再根据镜像为“模版”去创建容器。本地的镜像也可以发布到远程镜像库。
查看本地镜像 docker images
在Dockergub查找ubuntu镜像 docker search ubuntu
-
镜像是个什么样的文件?
镜像就是充当模版来使用,在他得内部包含打包好了的:运行所需依赖 + 业务代码。
后期基于镜像一键创建出的容器也就会自动包含依赖和业务代码,直接就可以运行了,不需要再安装+拷贝代码了。 -
container容器
容器就是根据镜像创造出来的一个个隔离的环境。
2.4 配置镜像下载加速
可以去阿里云等相关网站,找到自己的镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://jdkmqzpu.mirror.aliyuncs.com"]
}
EOFsudo systemctl daemon-reload 载入配置
sudo systemctl restart docker 重启Docker
2.5 设置宿主机网卡转发
sysctl -p /etc/sysctl.d/docker.confcat <<EOF > /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward=1
EOF
3.Docker 应用
3.1应用逻辑
1.获取镜像docker pull Ubuntu:xxx(系统版本) docker images 本地镜像2.构建镜像2.1 Dockerfile ·在Docker宿主机创建文件Dockerfile待运行文件·命令构建自定义镜像(模板)2.2基于镜像创建容器+运行
基础命令
docker search 镜像名称 在hub中找镜像
docker pull 镜像名称:版本号 下载镜像docker images 查看本地镜像
docker build -t 模板名称:版本号 . -f Dockerfile
docker run -d -p 80:8000 模板名称:版本号 (-d能后台运行 -p转发端口 80宿主机端口 8000容器转发端口) ---创建容易
docker ps 查看正在运行的容器
docker ps -a 查看所有容器
docker rm 容器ID 删除指定容器
3.2构建镜像
3.2.1编写Dockerfile
Dockerfile
# Base images 基础镜像
FROM ubuntu:18.04#MAINTAINER 维护者信息
LABEL maintainer wupeiqi@live.com#RUN 执行以下命令
RUN apt update
RUN apt install python3 python3-pip -y
RUN pip3 install flask
RUN mkdir -p /data/www/#拷贝文件至工作目录
COPY app.py /data/www/app.py#工作目录
WORKDIR /data/www/#EXPOSE 映射端口
EXPOSE 80#容器启动时执行命令
CMD ["python3","app.py"]
- FROM 指定基础镜像,必须为第一个命令
格式:FROM <image>FROM <image>:<tag> 示例:FROM mysql:5.7 注意:tag是可选的,如果不使用tag时,会使用latest版本的基础镜像
- MAINTAINER 镜像维护者的信息
格式:MAINTAINER <name> 示例:MAINTAINER xxxMAINTAINER xxx@live.comMAINTAINER xxx <xxx@live.com>
- ENV
格式:ENV <key> <value>ENV <key>=<value> 示例:ENV myName JohnENV myCat=fluffy
- COPY|ADD 添加本地文件到镜像中 app.py /data/www/info/app.py
格式:COPY <src>... <dest> 示例:ADD hom* /mydir/ # 添加所有以"hom"开头的文件ADD test relativeDir/ # 添加 "test" 到 $WORKDIR/relativeDir/ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/注意:针对压缩包使用ADD的话,会自动解压。
- WORKDIR 工作目录
格式:WORKDIR /path/to/workdir 示例:WORKDIR /a (这时工作目录为/a)
注意:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行
- RUN 构建镜像过程中执行命令
格式:RUN <command> 示例:RUN yum install nginxRUN pip install djangoRUN mkdir test && rm -rf /var/lib/unusedfiles
注意:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定–no-cache参数,如:docker build --no-cache
- CMD 构建容器后调用,也就是在容器启动时才进行调用
格式:CMD ["executable","param1","param2"] (执行可执行文件,优先)CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)CMD command param1 param2 (执行shell内部命令) 示例:CMD ["/usr/bin/wc","--help"]CMD ping www.baidu.com
注意:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
- ENTRYPOINT 设置容器初始化命令,使其可执行化
格式:ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)ENTRYPOINT command param1 param2 (shell内部命令) 示例:ENTRYPOINT ["/usr/bin/wc","--help"]
注意:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
- EXPOSE 暴漏端口
格式:EXPOSE <port> [<port>...] 示例:EXPOSE 80 443EXPOSE 8080EXPOSE 11211/tcp 11211/udp 注意:就是一个端口的标识,实际开发时,没什么意义。因为端口的映射会在run命令时进行指定。
3.2.2 构建镜像
构建指令
docker build -t v1:0.01 . -f Dockerfile
含有缓存构建镜像(创建的中间镜像会被缓存,并会在下次构建中使用)
docker build -t v1:0.01 . -f Dockerfile --no-cache
不含缓存
[root@192 crm]# docker build -t v0:0.1 . -f Dockerfile [root@192 crm]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
v1 0.01 0dd632180107 3 minutes ago 513MB
ubuntu 18.04 5a214d77f5d7 20 months ago 63.1MB
centos latest 5d0da3dc9764 20 months ago 231MB
3.3容器
根据创建的镜像(通常使用id)去创建容器并启动
[root@192 crm]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
v1 0.01 0dd632180107 3 minutes ago 513MB
ubuntu 18.04 5a214d77f5d7 20 months ago 63.1MB
centos latest 5d0da3dc9764 20 months ago 231MB[root@192 crm]# docker run -d -p 80:8000 cd885cb29f41
[root@192 crm]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
93352e1c52ec cd885cb29f41 "python3 app.py" 42 seconds ago Up 42
3.4 案例分析
3.4.1 基础指令案例
- 创建Dockerfile文件
# Base images 基础镜像
FROM ubuntu:18.04#MAINTAINER 维护者信息
LABEL maintainer xxxi xxxi@live.com# 环境变量
ENV PRO_PATH /data/www#RUN 执行以下命令
RUN mkdir -p PRO_PATH#RUN 执行以下命令
RUN mkdir -p $PRO_PATH/mediea#COPY 拷贝文件至工作目录
COPY *.py $PRO_PATH/#ADD 拷贝文件至工作目录+解压
ADD *.tgz $PRO_PATH/mediea/#指定工作目录/data/www/
WORKDIR /data/www/
- 构建镜像:
docker build -t v1:0.01 . -f Dockerfile1
- 创建容器:
# 创建容器,退出结束(因为容器中没有前台进程)
docker run v1:0.01# 创建容器,主动创建一个前台的输入进程
docker run -i v1:0.01
docker run -i v1:0.01 bash
docker run -i v1:0.01 sh# 创建容器,主动创建一个前台的输入进程,不卡宿主机
docker run -di v1:0.01
docker run -di v1:0.01 bash
docker run -di v1:0.01 sh# 创建容器,主动创建一个ping的进程
docker run centos ping baidu.com# 创建容器,主动创建一个ping的进程,不卡住宿主机(-d 后台运行不会影响宿主主机)
docker run -d centos ping baidu.com# 创建容器,主动创建一个终端+输入输出进程,进入容器内交互(退出容器停止,但不删除容器)
docker run -ti centos bash
docker run -ti centos /bin/sh
docker run -ti v0:0.1 bash# 创建容器,并进入容器内,退出时结束容器后,自动删除。
docker run -ti --rm centos bash# ############ 在正式开发时 ###############
# 创建容器(编辑镜像,让容器启动时自动创建一个前台进程)
docker run -d v0:0.1# 后期想要进入正在存活的容器
docker exec -it 容器ID bash
# 返回所有容器的id
docker ps -aq# 批量停止容器
docker stop `docker ps -aq`# 批量删除容器
docker rm `docker ps -aq`
3.4.2 CMD案例
CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
容器启动时,必须要有一个前台进程,一般在容器创建后去启动时,基于CMD运行一个前台进程。
- 构建镜像:
docker build -t v1:0.2 . -f Dockerfile2
- 创建容器+启动:
# 创建容器,由镜像中有前台线程,用-d参数,别卡主屏幕
docker run -d v1:0.2
# 后面的命令会覆盖CMD
docker run -d v1:0.2 ping pythonav.com
docker run -d v1:0.2 tail -f /data/www/app.py
3.4.3 ENTRYPOINT案例
与CMD不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。
Dockerfile中只允许有一个ENTRYPOINT命令,多定义会覆盖前面的设置,而只执行最后的ENTRYPOINT指令
- 构建镜像:
docker build -t v1:0.4 . -f Dockerfile4
- 创建容器+启动:
# 创建容器,由镜像中有前台线程,用-d参数,别卡主屏幕
docker run -d v1:0.4
# 后面的命令不会覆盖ENTRYPOINT,而是当成参数向后传入给ENTRYPOINT
docker run -d v1:0.4 ping pythonav.com
docker run -d v1:0.4 tail -f /data/www/app.py
3.5 Django项目的部署
3.5.1 编写Dockerfile
# Base images 基础镜像
FROM centos:7.9.2009#MAINTAINER 维护者信息
MAINTAINER xxx@live.com# GCC编译器
RUN yum install gcc -y# Python依赖
RUN yum install -y zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel mysql-devel python-devel libffi-devel# wget
RUN yum install wget -y# 目录
RUN mkdir -p /data/
WORKDIR /data/# SQLite升级
RUN wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz --no-check-certificate
RUN tar -zxvf sqlite-autoconf-3420000.tar.gz
WORKDIR /data/sqlite-autoconf-3420000
RUN ./configure
RUN make && make install
ENV LD_LIBRARY_PATH="/usr/local/lib"# Python3.9环境
WORKDIR /data/
RUN wget https://www.python.org/ftp/python/3.9.5/Python-3.9.5.tgz
RUN tar -xvf Python-3.9.5.tgz
WORKDIR /data/Python-3.9.5/
RUN ./configure
RUN make && make install
RUN pip3.9 config set global.index-url config set global.index-url https://mirrors.aliyun.com/pypi/simple/# git
RUN yum install git -y
RUN git config --global user.name "武沛齐"
RUN git config --global user.email "wupeiqi@live.com"# git拉代码
WORKDIR /data/
RUN git clone https://gitee.com/wupeiqi/blog.git# 虚拟环境
RUN pip3.9 install virtualenv
RUN virtualenv /envs/dj --python=python3.9
RUN /envs/dj/bin/pip3.9 install django==3.2# 运行项目
WORKDIR /data/blogCMD ["/envs/dj/bin/python","manage.py","runserver","0.0.0.0:9000"]
3.5.2 构建镜像
docker build -t dj:1.0 . -f Dockerfile
3.5.3 启动容器
# 测试启动
docker run -p 80:9000 --rm dj# 正经启动
docker run -d -p 80:9000 dj:1.0
3.5.4 镜像导出/导入
后期在项目部署时,会经常使用:CentOS + Python3.9.5 的环境,为了避免每次都编译生成,我们可以自己制作一个【CentOS + Python3.9.5 】的基础镜像,便于后续使用。
- 导出
docker image save dj:1.0 > centos76py39dj3.2.tgz
- 导入
导入前确保所有存在的镜像无重名镜像ps -a
docker image load -i centos76py39dj3.2.tgz