(四)Docker安装使用 容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 容器管理plus:docker本身是一个C/S架构客户端用于我们敲命令啊之类的服务端提供了一些api 等 可以通过ps -ef | docker 看到服务主进程 如果要拉你在公有仓库里面自己仓库里的东西可以docker login daocloud.

容器管理

plus:
docker本身是一个C/S架构
客户端用于我们敲命令啊之类的
服务端提供了一些api 等 可以通过ps -ef | docker 看到服务主进程

如果要拉你在公有仓库里面自己仓库里的东西可以

docker login daocloud.io
username:
password:

基本操作

容器相关操作
docker create # 创建一个容器但是不启动它 docker run # 创建并启动一个容器
docker stop # 停止容器运行,发送信号SIGTERM docker kill #强制终止一个容器
docker start # 启动一个停止状态的容器
docker restart # 重启一个容器
docker rmi # 删除一个容器
docker rm $(docker ps -a -q)
docker kill # 发送信号给容器,默认SIGKILL docker attach # 连接(进入)到一个正在运行的容器 docker wait # 阻塞到一个容器,直到容器停止运行 docker --restart=always 容器
docker ps # 显示状态为运行(Up)的容器
docker ps -a # 显示所有容器,包括运行中(Up)的和退出的(Exited)
docker inspect # 深入容器内部获取容器所有信息
docker logs -f # 查看容器的日志(stdout/stderr)(-f 用于实时输出)
docker events # 得到docker服务器的实时的事件
docker port # 显示容器的端口映射
docker top # 显示容器的进程信息
docker diff # 显示容器文件系统的前后变化

测试

创建一个容器并启动容器
比如:
docker run -it --name=inspect_shell centos:7 /bin/bash
创建一个名字为inspect_shell的容器,并启动了该容器(交互式容器)
docker run --name daemon_hello -d centos:7 /bin/bash -c "
while true;do echo hello word;sleep 1;done"
创建一个名字为daemon_hello的容器,并启动了该容器(后台型容器)

数据持久化

两种方式实现:
1.宿主机挂载点
-v
2.公用容器
--volumes-from

容器销毁不会影响到数据卷
在集群服务中可以通过实现宿主机存储集群来实现集群数据持久化

搭建LNMP网站

1.启动一个数据库
docker search 去找一个你需要的版本

docker pull mysql:5.6
你可以先获取镜像帮助来更好的使用镜像

docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=xy123456 --name xy_mysql mysql:5.6
映射到主机3307端口  创建一个密码为xy123456的数据库 容器名字为xy_mysql 镜像版本mysql5.6

同时 我们可以直接在真机上传入变量到容器 获取容器信息

docker exec  xy_mysql  sh -c 'mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "show databases" '

plus:这里为我们提供了一个一次性构建的思路

设置好mysql的密码是什么?创建的数据库是什么?要不要建立用户?建立用户要不要授权?
(这里可以同构shell脚本实现 同时也有更简单的方式 我在后面的博客中会记录 即通过导入sql表同时修改初始化配置文件来实现)
容器中的数据文件目录是什么? 如何挂载来实现存储数据的持久化?

2.创建一个php解析环境

docker run -d -  v   /var/nginx/www/html:/var/www/html -p 9000:9000 --link xy_mysql:mysql --name xy_phpfpm php:7.0-fpm 

参数说明
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射,即主机上的/var/nginx/www/html和容器中/var/www/html目录是同步的
–name 容器的名字
–link 与另外一个容器建立起联系,这样我们就可以在当前容器中去使用另一个容器里的服务。

这里如果不指定–link参数其实也是可以得,因为容易本身也是有ip的且唯一,所以我们也可以直接利用ip去访问容器。

然后进入到我们的容器,然后我们在/var/www/html目录下新建一个index.php文件`

touch index.php

我们发现我们在容器里的/var/www/html目录中新建的文件也在主机的/var/nginx/www/html目录中,因为在创建容器的时候,我们已经把主机中的目录挂载到了容器中去了。

因为后面我要使用pdo模块进行测试,所以我需要自己安装pdo_mysql模块,在docker容器中可以这样来安装

docker-php-ext-install pdo_mysql

然后我们可以通过命令php -m查看我们的php的所有扩展模块,我们可以去看到我们刚刚安装的pdo_mysql扩展也在里面

3.搭建nginx

docker run -d -p 80:80 --name xy_nginx\ 
-v /var/nginx/www/html:/var/www/html\
--link xy_phpfpm:phpfpm --name xy_nginx nginx:1.10.3

-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射,这里最好nginx容器的根目录最好写成和php容器中根目录一样。但是不一点非要一模一样,如果不一样在配置nginx的时候需要注意
–name 容器的名字
–link 与另外一个容器建立起联系

然后进入nginx容器,修改nginx的配置文件让它支持php

docker exec -ti xy_nginx /bin/bash

location ~ \.php$ {
        root           /var/www/html;
        fastcgi_index  index.php;
        fastcgi_pass   phpfpm:9000;//这里改成我们之前--link进来的容器,也可以直接用php容器的ip
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcdi_script_name;//如果你的根目录和php容器的根目录不一样,这里的$document_root需要换成你php下的根目录,不然php就找不到文件了
        include        fastcgi_params;                                                                                                                                               

    }

测试一波

<?php
try {
    $con = new PDO('mysql:host=mysql;dbname=test', 'xuye', 'xy123456');
    $con->query('SET NAMES UTF8');
    $res =  $con->query('select * from test');
    while ($row = $res->fetch(PDO::FETCH_ASSOC)) {
        echo "id:{$row['id']} name:{$row['name']}";
    }
} catch (PDOException $e) {
     echo '错误原因:'  . $e->getMessage();
}

当当当,看到正确的输出,就证明我们的配置成功了。一个最最最基本的环境就搭建好了。。

是不是参数很多很复杂????
没关系,后续我们可以通过docker-compose 来实现把这些参数写在yml文件里面 最后实现一次性构建 。

例如 :
构建node环境
node:

image: 7d10217beb82 镜像
container_name: node 容器名
ports:                            映射端口
    - "3014:3014"
    - "3050:3050"
    - "3051:3051"
    - "8010:8010"
    - "8024:8024"
    - "3005:3005"
volumes:
    - /data/www/htdocs:/data/www 数据持久化
extra_hosts:   附加进hosts文件
    - "db.pro.com:1.1.1.1"
restart: always           自动重启
这里配置虚拟域名作为项目中mysql连接地址 可以很好的避免开发环境和测试环境每次要修改连接的问题

nginx:

image: 169bd14dcf7a
container_name: nginx
links:
    - php
    - node
    - tomcat
ports:
    - "80:80"
    - "443:443"
    - "8000:8000"
volumes:
    - /data/www/htdocs:/data/www
    - /data/logs/nginx:/var/log/nginx
    - ./volumes/nginx/sites:/etc/nginx/sites-enabled
    - ./volumes/nginx/includes:/etc/nginx/includes
extra_hosts:
    - "db.pro.com:1.1.1.1"
restart: always

php:

image: 0b0b9f98dff2
container_name: php
ports:
    - "9000:9000"
links:
    - node
    - mongodb
    - redis
    - mysql           这是需要能访问到的容器
volumes:
    - /data/www/htdocs:/data/www
    - /data/logs/php:/data/logs/php
extra_hosts:
    - "db.pro.com:119.29.105.164"
restart: always

mysql:

image: 5a58d88e1b36
container_name: mysql
ports:
    - "3306:3306"
volumes:
    - /data/db/mysql:/data/db/mysql
    - /data/logs/mysql:/data/logs/mysql
environment:
    MYSQL_USER:  "user_test"
    MYSQL_PASSWORD: "N!F3ABaFui"
    MYSQL_ROOT_PASSWORD: "T41Df!x2L4"
restart: always

redis:

image: c12f15d2ef75
container_name: redis
ports:
    - "6379:6379"
volumes:
    - /data/db/redis:/data/db/redis
    - /data/logs/redis:/data/logs/redis
restart: always

memcached:

image: 1739564665db
container_name: memcached
ports:
    - "11211:11211"
restart: always

mongodb:

image: 8e058d1bebf7
container_name: mongodb
ports:
    - "27017:27017"
volumes:
    - /data/db/mongodb:/data/db/mongodb
    - /data/logs/mongodb:/data/logs/mongodb
environment:
    AUTH: "yes" 
    JOURNALING: "yes"
    MONGODB_DATABASE: "test"
    MONGODB_USER: "test"
    MONGODB_PASS: "541R4evB"
restart: always 

最终就会一键构建起一套
以nginx作为web容器 能解析php项目 访问到node接口 后端有mysql mongo以及redis 并且数据能够持久化保存的一套web环境

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
118 77
|
11天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
4天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
29 3
|
11天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
41 7
|
11天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
23 5
|
11天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
31 3
|
11天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
32 4
|
11天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
21 2
|
11天前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
28 1
|
13天前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
30 1