1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
uname -r #查看你当前的内核版本
2、使用 root 权限登录 Centos。确保 yum 包更新到最新。
yum update
3、卸载旧版本(如果安装过旧版本的话)
yum remove docker docker-common docker-selinux docker-engine
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置yum源
# 建议设置成第一个 第二个太慢了
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#设置完以后再执行如下命令
yum makecache fast
6、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
7、安装docker
#由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0
yum install docker-ce.x86_64
安装过程报错了:
分析原因
看上面的内容,说的是containerd.io >= 1.2.2-3 ,意思就是 containerd.io 的版本必须大于等于 1.2.2-3
解决方案:
降低docker 的版本或者更新 containerd.io 的版本
wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
然后回到第7步骤 输入
yum install docker-ce.x86_64
8、启动并加入开机启动
systemctl start docker
systemctl enable docker
9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
docker version
10、查看docker列表
docker images
11、修改配置文件 可以参考链接:daemon.json详解
1. vi /etc/docker/daemon.json //如果没有新建该文件
2. 添加以下内容
{
"registry-mirrors": [""],
"live-restore":true
}
3. 保存退出
12、常用命令
#查看所有镜像
docker images
#查看所有容器
docker ps -a
#查看运行中的容器
docker ps
#删除容器
docker rm 容器id
#删除镜像
docker rmi 镜像id
#停止容器、同理还有start restart status
docker stop 容器id/容器名
#进入容器
docker exec -it 容器名 /bin/bash
#创建容器但是不启动
docker create
#创建容器并启动
docker run
#重命名
docker rename
#查看容器日志
docker logs 容器名
以上安装docker 内容完毕,接下来通过运行环境.
先安装php比较好,因为后面安装nginx的时候,需要两个容器关联。
1.查找Docker Hub上的php镜像
docker search php
2.拉取官方的镜像
docker pull php:7.4-fpm #指定版本号
3.创建php容器
#虚拟机下新建文件夹
mkdir /usr/local/php7.4
#启动php容器
docker run -p 9000:9000 --name php -d php:7.4-fpm
#拷贝配置文件
docker cp 0850901bc597:/etc/php/7.4/fpm/php.ini /usr/local/php7.4/php.ini
#停止、删除容器
docker stop php
docker rm b2009f54cf34
#正式部署 (这里如果宿主机没有/var/www目录的话 需要新建一下)
docker run -p 9000:9000 --name php -v /var/www:/var/www/html -v /usr/local/php7.4/php.ini:/etc/php/7.4/fpm/php.ini -d php:7.4-fpm
第一个-v php容器和宿主机共享目录
第二个-v 映射配置文件
PHP容器中安装composer
容器中安装composer才可以执行php artisan、composer install等命令
安装步骤:
1.docker exec -it cb6c1fe83bff(php容器ID) bash
2.php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
3.php composer-setup.php
4.php -r "unlink('composer-setup.php');"
5.mv composer.phar /usr/local/bin/composer
PHP容器中安装扩展(以GD库为例)
apt update #更新软件源
apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev #安装依赖库
docker-php-source extract #解压源码
cd /usr/src/php/ext/gd #gd源码文件夹
**这里不适用于php7.4!!
docker-php-ext-configure gd --with-webp-dir=/usr/include/webp --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-freetype-dir=/usr/include/freetype2 #准备编译
**php7.4要用以下的编译方法!!
docker-php-ext-configure gd --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2
docker-php-ext-install gd #安装并启用gd库
php -m #查看是否安装成功
php容器中安装redis扩展
redis-5.3.7
1. 宿主机下载安装包 这里下载的是5.3.7,之前下载了一个5.0的没有安装成功。
2. 解压 tar -zxvf redis-5.3.7.tgz
3. 复制文件到容器里
4. docker cp ./redis-5.3.7/* php:/usr/src/php/ext/redis # php代表容器名 (如果没有此目录 记得去容器里新建一个)
5. 进入容器
6. docker exec -it php /bin/bash
7. cd /usr/src/php/ext/redis
8. 安装命令
9. docker-php-ext-install redis
10.查看php扩展 php -m
1.搜索可用的nginx
docker search nginx
2.拉取官方的镜像
docker pull nginx
3.创建并运行容器,并拷贝nginx的默认配置文件。
#创建并运行容器
docker run --name nginx -p 80:80 -d nginx
#在虚拟机创建以下几个目录
mkdir /var/www
mkdir /usr/local/nginx
mkdir /usr/local/nginx/conf
mkdir /usr/local/nginx/conf/conf.d
mkdir /usr/local/nginx/logs
#拷贝nginx默认配置文件 docker ps 命令可以看到容器id(b2009f54cf34 容器id)
docker cp b2009f54cf34:/usr/share/nginx/html/index.html /var/www/index.html
docker cp b2009f54cf34:/etc/nginx/nginx.conf /usr/local/nginx/conf/nginx.conf
docker cp b2009f54cf34:/etc/nginx/conf.d/default.conf /usr/local/nginx/conf/conf.d/default.conf
#先停止容器,再删除容器
docker stop b2009f54cf34
docker rm b2009f54cf34
#删除所有容器--谨慎使用!!!
docker rm `docker ps -a -q`
4.正式部署nginx
docker images 可以查看已经下载的镜像。
刚才删除的是启动后的docker容器,并没有删除pull下来的镜像,所以可以直接运行以下命令,再去启动一个nginx容器。
docker run --name nginx -p 80:80 -v /var/www:/usr/share/nginx/html \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx/logs:/var/log/nginx -d --link php:php nginx
# 第一个-v 是将容器内nginx的html目录共享到宿主机(虚拟机)的www目录下
# 第二、三个-v是将容器内nginx的配置文件共享到宿主机的指定目录下(刚创建的)
# 第四个-v是将容器内的日志文件共享到宿主机指定目录下
# --link php:php 这个很重要!!! 关联php容器
--name 这里是别名,使用docker ps 会最后显示names
-p 80:80 第一个80是服务器的端口,第二个80是docker容器端口,
-d 要运行的容器名称 这里是nginx
-v 虚拟机位置:容器位置 做映射
nginx配置示例
server {
listen 8083;
listen [::]:8083;
server_name localhost;
location / {
root /usr/share/nginx/html/laravel-hand-touch/public;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
fastcgi_pass php:9000; # 这里很重要! 前面php容器名再加9000
fastcgi_index index.php;
#这里路径直接用的项目所在的路径 改成/scripts$fastcgi_script_name;应该也好使。但是没试
fastcgi_param SCRIPT_FILENAME /var/www/html/laravel-hand-touch/public$fastcgi_script_name;
include fastcgi_params;
}
}
此时,nginx安装完成
通过 docker ps -a 查看所有容器。
通过 netstat -nltp 可以查看到80 端口已经启动。
此刻访问虚拟机的IP,nginx 正常运行起来
docker安装mysql
1.查找镜像:
docker search mysql
也可以去官网查看镜像tag,选择自己需要的版本,否则会下载最新版本:https://hub.docker.com/_/mysql/
2.下载镜像(如上一步,可以指定想要的版本,不指定则为最新版):
docker pull mysql
3.通过镜像创建容器并运行:
docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
-v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
此时,用navicat for mysql连接mysql发现报错:Client does not support authentication protocol requested by server。。。
解决方案:
1.进入容器
docker exec -it mysql /bin/bash
2.进入mysql,并且更换数据库
mysql -uroot -p #密码123456
use mysql;
3.开启远程访问权限
GRANT ALL PRIVILEGES ON *.* TO root@'%' WITH GRANT OPTION;
4.更改密码加密方式
ALTER USER 'root'@'%' IDENTIFIED BY 'root123456' PASSWORD EXPIRE NEVER;
5.更新用户密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root123456';
6.刷新权限
FLUSH PRIVILEGES;
以上是MySQL安装的全过程,目前的环境搭建已经全部完成了。
docker searech redis
docker pull redis
mkdir /usr/local/redis && mkdir /usr/local/redis/data
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name redis -v /usr/local/redis/myredis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
--restart=always 总是开机启动
-p 6379:6379 将6379端口挂载出去
-d redis 表示后台启动redis
–appendonly yes 开启redis 持久化
–requirepass 123456设置密码
1.安装Jenkins docker镜像网站
1. docker search jenkins
2. docker pull jekins/jenkins //如果想拉取指定版本 可以去https://hub.docker.com/ 搜索docker,点击Tag 下载所需要的版本。
3. 注意!! 这里docker search jenkins的列表中虽然第一个的star最多,但是已经是老版本,不需要。我们就执行上一步的命令即可。
2.安装java环境
1. jdk8_linux百度网盘下载地址 提取码:80ku
2. 官网下载地址 – 不推荐。下载的比网盘慢,并且还得注册Oracle账号。
1. 将下载的tar.gz压缩包上传到/usr/local文件夹下。---这里我下载的是jdk-8u351-linux-x64.tar.gz版本
2. 执行解压命令 tar -zxvf jdk-8u351-linux-x64.tar.gz
3. 配置环境变量
1. vi /etc/profile
2. 在文件最下面填写以下内容
export JAVA_HOME=/usr/local/jdk1.8.0_351
export JRE_HOME=${JAVA_HOME}/jre
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/toos.jar:$JAVA_HOME/lib/dt.jar
3. source /etc/profile 使配置文件生效
4. java -version 验证是否配置成功
3.安装maven环境
下载maven安装包 官方地址 网盘地址 提取码:g54r 这里下载的是3.8.6版本
1.将压缩包上传至/usr/local文件夹下
2.执行命令 tar -zxvf apache-maven-3.8.6-bin.tar.gz 解压
3.再去执行命令 vi /etc/profile
4.在文件最下面的PATH路径中添加 :/usr/local/apache-maven-3.8.6/bin
5.source /etc/profile 使配置文件生效
6.mvn -version 验证maven是否生效
4.启动Jenkins容器
1. docker images # 查看已拉取的镜像
2. 启动Jenkins容器
创建Jenkins映射的地址
mkdir /usr/local/jenkins
chmod -R 777 /usr/local/jenkins
docker run -dit -uroot -p 8080:8080 -p 50000:50000 -v /usr/local/jenkins:/var/jenkins_home -v /etc/localtime:/etc/localtime -v /usr/local/apache-maven-3.8.6:/usr/local/maven -v /var/www:/opt/file -e JAVA_OPTS=-Duser.timezone=Asia/Shanghai --name jenkins jenkins/jenkins
** 注意这里执行的不是exec命令,没必要在后面加上/bin/bash 反正我加上这个参数是启动不了 **
3.参数解释
# -p 8080:8080 第一个8080指的是服务器的8080端口,第二个指的是容器内的8080端口。意思是将容器内Jenkins默认的8080端口(第二个)映射到服务器中的8080端口(第一个)上。
# -p 50000:50000 将镜像中的50000端口映射到服务器的50000端口上。后面的是镜像端口,前面第一个是服务器的端口,也就是ip:访问的端口
# -v /usr/local/jenkins:/var/jenkins_home 将容器内Jenkins默认的/var/jenkins_home工作空间映射到自己服务器新建的目录中(/usr/local/jenkins)
# -v /var/www:/opt/file 将容器中的/opt/file映射到宿主机/var/www文件夹中 (以便用nginx部署的时候指向到这里)
# -d 后台运行 -it不知道啥意思 好像是一直保持后台
# -uroot 设置操作权限root,镜像中默认的操作权限是jenkins
# -v /usr/local/apache-maven-3.8.6:/usr/local/maven 将镜像中的maven目录映射到服务器刚安装的maven目录
# jenkins/jenkins 这里对应的是docker images命令中拉取的Jenkins名。如果拉取的是指定版本,记得带上版本号(:版本号)
此外还可以配置镜像加速:
1. cd /usr/loca/jenkins
2. vi hudson.model.UpdateCenter.xml
3. 将 url 修改为 清华大学官方镜像:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
5.访问 服务器ip:8080即可访问到Jenkins。
在服务器/usr/local/jenkins/secrets/initialAdminPassword文件中可以看到默认的admin密码。
至此Jenkins安装成功。
jenkins中配置gitee地址。
1.首先在系统管理-插件管理中下载gitee插件。然后重启jenkins容器。
2.在系统管理-系统配置中配置gitee地址和个人令牌。
3.新建项目-选择gitee,然后选择git-输入仓库链接和用户名密码即可。
首先我本地有一个码云上的项目。我下载到了G:\phpstudy_pro\WWW\personal目录下。码云地址
然后进行virtual的挂载设置,将phpstudy下的www目录挂载到虚拟机根目录下的www目录中。我本地很多项目,所以都会加载到。如图
执行如下命令
# 现在是把windows上的项目挂载到了虚拟机的/share目录中。
# 但是如果在nginx中直接绑定项目的public目录会报错,因为/share没有执行权限。
# 这时候需要在/home/user_account/目录下,也就是你自己创建的账户目录下新建share文件目录。
# 然后将Windows共享的目录挂载到这个目录就可以了。
#执行如下代码
cd /home/zlsn
mkdir share
mount -t vboxsf www /home/zlsn/share
#注意!!其中www是Windows的目录名,我这里是phpstudy中的www目录。
/home/zlsn/share是虚拟机的目录路径,zlsn是我的虚拟机账户
挂载之后就可以访问了
修改docker中的nginx映射文件
# 1.查看nginx映射关系
docker inspect -f "{{.Mounts}}" nginx
# 2.下面将宿主机挂载的目录从/www变更为/home/zlsn/share,容器中对应的目录不变/usr/share/nginx/html。步骤如下:
# 3.查看nginx的容器id
docker ps (我这里的nginx容器id为423dee110622)
# 4.关闭docker容器
docker stop nginx
# 5.停止docker服务
systemctl stop docker
# 6.修改docker配置文件 --注意config.v2.json有两个地方需要修改!
cd /var/lib/docker/containers/423dee110622开头的文件
将文件config.v2.json和hostconfig.json中的"Source"从/nginx更改为/home/zlsn/share
# 7.开启docker服务
systemctl start docker
# 8.启动nginx容器
docker start nginx
# 9.再次查看,此时已经修改成功
docker inspect -f "{{.Mounts}}" nginx
#10.php的映射关系也要改一下
注意,修改完以后的映射关系如下
# 查看nginx的映射关系
docker inspect -f "{{.Mounts}}" nginx
映射关系如下
[{bind /home/zlsn/share /usr/share/nginx/html true rprivate} {bind /usr/local/nginx/logs /var/log/nginx true rprivate} {bind /usr/local/nginx/conf /etc/nginx/conf true rprivate} {bind /usr/local/nginx/conf/conf.d /etc/nginx/conf.d true rprivate}]
# 查看php的映射关系
docker inspect -f "{{.Mounts}}" php
映射关系如下
[{bind /usr/local/php/php.ini /etc/php/7.4/fpm/php.ini true rprivate} {bind /home/zlsn/share /usr/share/nginx/html true rprivate}]
修改nginx配置文件
# 进入配置目录
cd /usr/local/nginx/conf/conf.d
# 修改配置
vim test.conf
# 写入如下代码
server {
listen 80;
listen [::]:80;
server_name www.cremb.com;
root /usr/share/nginx/html/personal/CRMEB-Min/src/crmeb/public;
location / {
index index.php index.html index.htm;
autoindex off;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
break;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass 172.17.02:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
include fastcgi_params;
}
}
#windows本地host文件中加入,即可在本地访问此网址。
虚拟机ip www.cremb.com
windows本地访问www.cremb.com 即可成功。
1.配置多站点
目前想到的办法是这样:多映射几个端口到宿主机,然后访问宿主机某个端口的时候,自然就访问到nginx容器中的对应端口了!
如下
docker run --name nginx -p 8081:8081 -p 8082:8082 -p 8083:8083 -p 8084:8084 -p 8085:8085 -v /var/www:/usr/share/nginx/html -v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d -v /usr/local/nginx/logs:/var/log/nginx -d nginx
容器中安装vim
apt-get update
apt-get install vim
cat << EOF > /root/.vimrc
:set encoding=utf-8
:set fileencodings=ucs-bom,utf-8,cp936
:set fileencoding=gb2312
:set termencoding=utf-8
EOF
查看php容器IP
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' php
注意事项
1.php的内网IP要配置到nginx中的配置文件里。
2.php的映射目录要替换掉$document
配置swap
如果服务器的配置不高,可以选择配置一下swap
1. free -h 查看内存配置情况。一般是没有配置swap的
2. 运行df -h,查看硬盘空间使用情况,确保有足够的空间
3. 配置命令:dd if=/dev/zero of=/var/swap bs=1M count=5120 解释:if 表示infile,of表示outfile,bs=1M代表增加的模块大小是1M,count=5120代表模块个数5120,也就是5G空间
4. 以下命令启用swap
5. mkswap /var/swap
6. mkswap -f /var/swap
7. swapon /var/swap
8. 再次运行free -m 查看是否已经启用swap
9. 设置swap文件永久有效
10. vi /etc/fstab && 文件中添加上如下内容:/var/swap swap swap defaults 0 0
10.取消swap swapoff /var/swap && rm -rf /var/swap
运行laravel项目如果报错Failed to clear cache. Make sure you have the appropriate permissions.
在storage/framework/cache目录下新建data文件夹就好了
docker exec -it php /bin/bash
docker-php-ext-install pdo pdo_mysql