猿创征文|手把手玩转docker,从入门到精通
一、docker介绍
1、docker简介
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
2、docker 的主要用途
目前有三大类
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
- 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
3、docker、docker-compose、docker swarm和k8s的区别
1. Docker
Docker 是一个容器引擎,容器是由Docker创建,运行在Docker中,其他相关的容器技术都是以Docker为基础,它是我们使用其他容器技术的核心。
2. Docker-Compose
Docker-Compose 是用来管理你的容器的,有点像一个容器的管家,想象一下当你的Docker中有成百上千的容器需要启动,如果一个一个的启动那得多费时间。有了Docker-Compose你只需要编写一个文件,在这个文件里面声明好要启动的容器,配置一些参数,执行一下这个文件,Docker就会按照你声明的配置去把所有的容器启动起来,只需docker-compose up即可启动所有的容器,但是Docker-Compose只能管理当前主机上的Docker,也就是说不能去启动其他主机上的Docker容器
3. Docker Swarm
Docker Swarm 是一款用来管理多主机上的Docker容器的工具,可以负责帮你启动容器,监控容器状态,如果容器的状态不正常它会帮你重新帮你启动一个新的容器,来提供服务,同时也提供服务之间的负载均衡,而这些东西Docker-Compose 是做不到的
4. Kubernetes
Kubernetes它本身的角色定位是和Docker Swarm 是一样的,也就是说他们负责的工作在容器领域来说是相同的部分,都是一个跨主机的容器管理平台,当然也有自己一些不一样的特点,k8s是谷歌公司根据自身的多年的运维经验研发的一款容器管理平台。而Docker Swarm则是由Docker 公司研发的。
二、docker使用
1、linux安装docker
docker 分为两个分支版本: Docker CE 和 Docker EE。
Docker CE 即社区免费版
Docker EE 即企业版,强调安全,但需付费使用。
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务
sudo systemctl start docker
设置docker自动重启
systemctl enable docker
测试运行 hello-world
docker run hello-world
查看docker版本
2、镜像使用
docker version 显示docker版本
docker info 显示 Docker 系统信息,包括镜像和容器数
docker pull 拉取镜像
docker images 列出本地的镜像
docker rmi nginx 删除镜像
docker search httpd 查找镜像
3、容器使用
docker ps 运行中的容器
docker ps -a 查看所有容器
docker ps -a -q 查看所有容器ID
拉取官方的镜像 (拉取最新的nginx)
docker pull nginx
docker run 创建并运行容器
docker run --name nginx -p 80:80 -d nginx
–name 容器名称
-v 本地目录:容器目录 //目录映射
-p 本地端口:容器端口 //端口映射
-d 增加一个驻留在进程中长期运行的命令,
-i 打开STDIN,用于控制台交互
-t该可以支持终端登录,默认为false
-m 设置容器使用内存最大值
#进入容器
docker exec -it nginx bash
docker stop containerId/name 停止容器
docker start containerId/name 开启容器
docker kill containerId/name 杀死一个或多个指定容器进程
docker top containerId/name 查看容器进程
docker rm nginx 删除容器
docker stop $(docker ps -a -q) #stop停止所有容器
docker rm $(docker ps -a -q) #remove删除所有容器
容器设置为开机自启动
docker update --restart=always 容器
docker update --restart=always id/name
docker run -d --restart=on-failure:3 id/name
restart后面的参数:
no 默认策略,在容器退出时不重启容器
on-failure 在容器非正常退出时(退出状态非0),才会重启容器
on-failure:n 在容器非正常退出时重启容器,最多重启n次
always 在容器退出时总是重启容器
4、docker查看错误日志
docker logs [容器名/容器ID]
三、docker搭建nginx+php+mysql环境
1、创建网络 (默认为桥接)
首先要创建桥接网络
docker network create lnmp
查看网络列表
docker network ls
2、docker安装mysql
拉起MySQL镜像
如果要指定版本,使用下面的命令
docker pull mysql:8.0.29
运行MySQL容器
docker run \
-p 3306:3306 --privileged=true \
--name mysql \
-v /www/docker/mysql/conf:/etc/mysql/conf.d \
-v /www/docker/mysql/logs:/var/log/mysql \
-v /www/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--network lnmp --network-alias mysql \
-dit mysql:8.0.29
--character-set-server=utf8mb4
设置为开机启动
docker container update --restart=always mysql
进入容器,登录MySQL
docker exec -it mysql bash
mysql -uroot -p
3、docker安装php
拉取php镜像
docker pull php:8.1.7-fpm
新建 /www目录作为项目目录,根据自己的需要做映射
docker run \
-p 9000:9000 -v /www:/www \
--link redis:redis --link mysql:mysql \
--network lnmp --network-alias php8 \
--name php8 --privileged=true \
-dit php:8.1.7-fpm
设置php开机启动
docker container update --restart=always php8
php安装扩展:
docker exec php8 docker-php-ext-install pcntl
docker exec php8 docker-php-ext-install pdo_mysql
docker exec php8 docker-php-ext-install mysqli
docker exec php8 docker-php-ext-install iconv
docker exec php8 docker-php-ext-install gd
docker exec php8 docker-php-ext-install mbstring
docker exec php8 docker-php-ext-install opcache
4、docker安装 Nginx
拉取官方的镜像
docker pull nginx:1.22.0
我们就可以在本地镜像列表里查到 REPOSITORY 为 nginx 的镜像。
docker images nginx
创建挂载目录
mkdir -p /www/docker/nginx/conf
mkdir -p /www/docker/nginx/log
mkdir -p /www/docker/nginx/html
使用 nginx 镜像
注意:docker ps 时,如果nginx不存在,在需要查看log日志
docker logs 容器id //新建容器的时候会返回容器ID
拷贝把容器配置文件拷贝到主机的映射目录
docker ps -a
生成容器
docker run --name nginx -p 9001:80 -d nginx
将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /www/docker/nginx/nginx.conf
容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /www/docker/nginx/conf.d
将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /www/docker/nginx/
查看容器启动情况
docker ps
docker run \
--link php8:php8 --link redis:redis --link mysql:mysql \
--network lnmp --network-alias nginx \
-p 80:80 --name nginx --privileged=true \
-v /www:/www \
-v /www/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /www/docker/nginx/conf.d:/etc/nginx/conf.d \
-v /www/docker/nginx/log:/var/log/nginx \
-v /www/docker/nginx/html:/usr/share/nginx/html \
-dit nginx:1.22.0
设置开机启动
docker container update --restart=always nginx
nginx配置
在/www/docker/nginx/conf/conf.d目录中添加www.gsj.com.conf文件
server {
listen 80;
server_name www.gsj.com;
set $web_root /www/php/www.gsj.com;
location / {
root $web_root;
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass php8:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $web_root$fastcgi_script_name;
include fastcgi_params;
}
}
docker exec -it [nginx容器名/id] bash
nginx -s reload
本地hosts配置
vim /etc/hosts
127.0.0.1 www.gsj.com
可以在docker中查看相关容器