docker记录
Posted djwhome
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker记录相关的知识,希望对你有一定的参考价值。
docker记录
1.下载
-
手动下载安装
如果需要手动下载,请点击以下链接下载 Stable 或 Edge 版本的 Docker for Mac。
但是上面的地址是国外的,所以特别慢,推荐阿里云mac下载地址,全部系统的docker镜像地址
-
查看docker版本
在终端中输入:docker --version
显示Docker version 19.03.8, build afacb8b
2.配置
-
镜像加速
-
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,可用镜像地址:
- 网易的镜像地址:http://hub-mirror.c.163.com。
- 阿里云的镜像加速器中,会给每个人配备一个专属的加速器地址,类似: https://xxxxxx.mirror.aliyuncs.com
- 备用:https://registry.docker-cn.com/
- 七牛云加速器:https://reg-mirror.qiniu.com
-
配置
- 可以在docker客户端配置-->daemon json配置中加一项:"registry-mirrors": ["https://t5t8q6wn.mirror.aliyuncs.com"]
- 也可以直接找到daemon.json,文件位置一般位于: /etc/docker/ 或者 ~/.docker/ 目录下,修改为:
{ "registry-mirrors" : ["https://xxxxxx.mirror.aliyuncs.com"] }
-
不同的配置方式
- 拉取的时候,指定镜像的全部地址
$ docker pull registry.docker-cn.com/library/ubuntu
- 添加"https://registry.docker-cn.com" 到 registry-mirrors 数组在 /etc/docker/daemon.json ,这样中国镜像变成了默认。
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
- 可以配置docker的守护进程--registry-mirror启动参数
$ dockerd --registry-mirror=https://registry.docker-cn.com
- 拉取的时候,指定镜像的全部地址
-
-
查看配置
docker info
查看docker相关信息
-
配置dns
修改.daemon.json 文件来设置全部容器的dns,需要重启docker才能生效
{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
-
登录 和github一样,有docker hub,用自己的账号可以在上面建立仓库,存储镜像,
docker login
登录docker logout
登出docker push username/ubuntu:18.04
username为你的账号名 ubuntu:18.04为镜像名和tag标签
3.安装
在安装镜像之前,我们需要知道各种镜像都有什么版本,可以去官方查看,我们找到对应的软件,然后查看它的tag列表即可,我们安装的时候,可以指明我们需要的tag号 docker pull mysql:5.6
, 菜鸟教程里面有个笔记很详细,也可以参考
3.1安装nginx
- 查看可用版本
docker search nginx
命令来查看可用版本 - 取最新版的 Nginx 镜像:
docker pull nginx:latest
- 查看本地是否安装了nginx镜像:
docker images
- 运行容器:
docker run --name test-nginx -p 8080:80 -d nginx:latest
--name nginx-test: 容器名称 -p 8080:80 端口映射 将本地8080端口映射到容器内部的80端口上 -d 加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)
- 安装成功:访问
127.0.0.1:8080
可以看到访问成功界面
3.2安装php
-
docker search php
-
docker pull php:7.0-fpm
默认为:docker pull php:latest
-
mkdir -p ~/docker/nginx/www
-
启动php
docker run --name test-php -v ~/docker/nginx/www:/docker/php/www:ro -d php:7.0-fpm
--name test-php :将容器名称定义为 test-php -v ~/docker/nginx/www:/docker/php/www 将主机项目中的目录www挂载到容器的www目录 -d 后台运行
注意 注意 注意
- ~/docker/nginx/www 是PHP和nginx的本地目录,要保持php和nginx一致
- /docker/php/www 是php在容器中的目录,要和下面得default.conf中的fastcgi_param SCRIPT_FILENAME /docker/php/www/$fastcgi_script_name; 一致
- 配置nginx的容器目录时候 要严格/etc/nginx/conf.d 我原来为了保持一致 写成了/etc/nginx/conf/conf.d 结果打开php页面就一直下载,踩坑半天...
- 在shell脚本中,用EOF的时候一定要注意default中的变量解析
3.3nginx和php部署
-
创建 ~/docker/nginx/conf/conf.d 目录:
mkdir -p ~/docker/nginx/conf/conf.d
mkdir -p ~/docker/nginx/www
-
在该目录下添加 vim ~/docker/nginx/conf/conf.d/default.conf 文件,内容如下:
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; #项目的根目录 index index.html index.htm index.php; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } location ~ .php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /docker/php/www/$fastcgi_script_name; include fastcgi_params; } }
配置文件说明:php:9000: 表示 php-fpm 服务的 URL,下面我们会具体说明。
/docker/php/www/: 是 test-php 中 php 文件的存储路径,映射到本地的 ~/docker/nginx/www 目录。 -
启动nginx
docker run --name test-nginx -p 80:80 -v ~/docker/nginx/www:/usr/share/nginx/html:ro -v ~/docker/nginx/conf/conf.d:/etc/nginx/conf.d:ro --link test-php:php -d nginx:latest
-name 容器的名称 -p 端口映射,把本地的80映射到容器的80端口 -v 挂载 ~/docker/nginx/www是本地的html文件目录,/usr/share/nginx/html是容器内html的文件存储目录 ~/docker/nginx/conf/conf.d是本地的nginx配置文件的目录,/etc/nginx/conf.d是容器内nginx配置文件的目录 :ro 表示只读 --link test-php:php 把test-php的网络并入到nginx中,并修改nginx的/etc/hosts 把域名php映射成127.0.0.1,让nginx通过php:9000访问php-fpm
3.4安装mysql
docker search mysql
docker pull mysql:5.7
- 创建所需目录 data logs conf
mkdir -p ~/docker/mysql/data ~/docker/mysql/logs ~/docker/mysql/conf
data 目录将映射为MySQL容器数据文件存放目录
logs 目录将映射为mysql容器的日志目录
conf 目录里的配置文件将映射为mysql容器的配置文件 - 创建容器
docker run --name test-mysql -p 3306:3306 -v ~/docker/mysql/data:/docker/mysql/data -v ~/docker/mysql/conf:/etc/mysql -v ~/docker/mysql/logs:/docker/mysql/logs -e MYSQL_ROOT_PASSWORD=123456 --link test-php:php -d mysql:5.7
-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。 MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。 注意:这里的mysql:后面要加对应的tag 如果不加,他会默认去用latest,如果没有,它回去pull
- 进入mysql客户端
docker run -it --link test-mysql:mysql --rm mysql sh -c ‘exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"‘
3.5安装phpmyadmin
docker pull phpmyadmin/phpmyadmin
这里就按search出来的名字, 一个phpmyadmin会找不到docker run --name test-phpmyadmin -p 8080:80 --link test-mysql:db -d phpmyadmin/phpmyadmin:latest
- 打开127.0.0.1:8080你就可以看到登录界面啦
3.6 shell脚本 一键安装nmpp
```
#!/bin/bash
#先清除所有容器 要先停止再删除
docker stop $(docker ps -q) && docker rm $(docker ps -aq)
#首先创建文件夹和文件
mkdir -p ~/docker/nginx/www ~/docker/nginx/conf/conf.d
mkdir -p ~/docker/mysql/conf ~/docker/mysql/logs ~/docker/mysql/data
touch ~/docker/nginx/conf/conf.d/default.conf
#写入配置文件
cat >> ~/docker/nginx/conf/conf.d/default.conf <<EOF
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html; #项目的根目录
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ .php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /docker/php/www/$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
#EOF中得变量会被解析 这里$前要加,这个错误我找了一下午...
# EOF 加反斜杠,或用单引号、双引号包围 。适用变量多的情况 <<‘EOF‘
#创建容器
docker run --name test-php -v ~/docker/nginx/www:/docker/php/www:ro -d php:7.0-fpm
docker run --name test-nginx -p 80:80 -v ~/docker/nginx/conf/conf.d:/etc/nginx/conf.d:ro -v ~/docker/nginx/www:/usr/share/nginx/html:ro --link test-php:php -d nginx:latest
docker run --name test-mysql -p 3306:3306 -v ~/docker/mysql/conf:/docker/mysql/conf:ro -v ~/docker/mysql/logs:/docker/mysql/logs:ro -v ~/docker/mysql/data:/docker/mysql/data -e MYSQL_ROOT_PASSWORD=123456 --link test-php:php -d mysql:5.7
docker run --name test-phpmyadmin -p 8080:80 --link test-mysql:db -d phpmyadmin/phpmyadmin:latest
```
3.7安装redis
docker search redis
docker pull redis:latest
docker run -itd --name test-redis -p 6379:6379 redis:latest
创建容器docker exec -it test-redis /bin/bash
然后再执行redis-cli
进入操作界面
3.8安装redis集群
4.docker命令集合
-
帮助命令
docker
docker coomand --help
-
操作容器
-
docker run -itd --name test-redis -v ~/redis/logs:/logs:ro -P --dns=8.8.8.8 --network test-net redis:latest /bin/bash
-i 交互式操作 通常和-t一起使用 -t 终端 -d 后台运行容器并返回容器id -p 指定主机和容器的端口映射 端口后面可以加/tcp /udp默认是/tcp -P 随机端口映射 -v 绑定一个卷,挂载映射目录 --name xxx 为容器指定一个名称 --network netName 指定network --dns=8.8.8.8 指定当前容器的dns --link test-mysql:db 添加链接到另一个容器 /bin/bash 在容器内执行/bin/bash命令 要退出终端 exit
-
docker start/stop/restart container id/container name 对一个或者多个容器进行启动/停止/重启
-
docker attach container id/name
进入容器,但是如果用attach退出容器时,会导致容器停止 -
docker exec container id/name
推荐使用exec进入容器,退出容器终端也不会导致容器停止
-
-
查看容器
-
docker images
查看所有镜像 -
docker ps
查看所有正在运行的容器 -
docker ps -a
查看所有容器,包括未运行的 -
docker ps -q
静默模式,只显示容器编号 -
docker ps -l
查看最后一次创建的容器信息
-
-
查看更多容器信息
docker port container name/id
查看容器的端口映射情况docker logs -f container name/id
查看容器的内部标准输出 -f 类似 tail -f 来输出容器内部的标准输出docker top container name/id
查看容器内部的进程docker inspect container name/id
查看容器的配置和状态信息,是一个json格式的文件
-
删除容器
-
docker rm -f -l - v containerName
删除容器 ,删除容器必须是容器在停止的状态下,否则会报错-f 可以强制删除一个运行中的容器 -l 删除容器之间的链接 -v 删除与容器相关的卷
-
docker contianer prune
清理掉所有处于终止状态的容器 -
docker stop $(docker ps -q)
停止全部运行中的容器 -
docker rm $(docker ps -aq)
删除全部容器 -
docker stop $(docker ps -q) && docker rm $(docker ps -aq)
一条命令实现停用并删除容器
-
-
导出/导入容器
docker export container id/name > xxx.tar
导出容器到本地目录 一定要加 >cat nignx.tar | docker import - imageName:tag
将外部导入到本地镜像,不是容器哦,容器需要通过本地镜像来生成docker import url
也可以导入远程url或某个目录
-
更新镜像
从已经创建的容器中跟新镜像,并提交这个镜像-
docker run --name old-ubuntu -it ubuntu:15.10 /bin/bash
-
apt-get-updata
在进行的容器中进行更新 -
exit
退出容器 -
docker commit -m "my update" -a="djw" container id image name :tag
-m 提交的描述信息 -a 指定镜像的作者
-
-
创建镜像
-
vim Dockerfile
创建一个Dockerfile文件FROM centos:6.7 MAINTAINER Fisher "fisher@sudops.com" RUN /bin/echo ‘root:123456‘ |chpasswd RUN useradd runoob RUN /bin/echo ‘runoob:123456‘ |chpasswd RUN /bin/echo -e "LANG="en_US.UTF-8"" >/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D 每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。 第一条FROM,指定使用哪个镜像源 RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。 Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
-
docker build -t djw-centos6.7 .
-t 指定要创建的镜像名 . Dockerfile文件所在目录,可以指定绝对路径 -
docker run -it djw-centos6.7 /bin/bash
-
docker tag image id djw-centos6.7:dev
镜像id 镜像源名 新的tag标签
-
-
容器互联
docker network create -d bridge test-net
新建网络 -d 指定网络类型,有 bridge overlaydocker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
- 这样2个容器都在一个网络中,就可以互相ping了,容器之间建立的互联
5.docker compose
5.1简介
- Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
- 如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程。
- Compose 使用的三个步骤:
- 使用 Dockerfile 定义应用程序的环境。
- 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
5.2安装
mac在安装docke的时候就附带了compose,我们可以查看它是否真的安装docker-compose --version
6.docker machine
7.swarm集群管理
8.docker 搭建redis集群
-
Redis 集群是一个提供在多个 Redis 节点间共享数据的程序集。
-
Redis 集群并不支持处理多个 keys 的命令,因为这需要在不同的节点间移动数据,从而达不到像 Redis 那样的性能,在高负载的情况下可能会导致不可预料的错误.
-
Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。
-
Redis 集群的优势:
- 自动分割数据到不同的节点上。
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
-
Redis 集群没有使用一致性 hash, 而是引入了哈希槽的概念。Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
-
下载配置文件,打包好的全部配置 可以直接使用
-
要点
- 多个节点的redis.conf
- redis.sh /config不需要修改路径
- docker-compose.yml 文件中的这个地方要更改
/c/project/docker/redis/config
这里要改成你自己的下载文件中config对应的目录路径 - 下面的错误,就是因为上面没修改导致的
The path /c/project/docker/redis/config is not shared from OS X and is not known to Docker. You can configure shared paths from Docker -> Preferences... -> File Sharing. See https://docs.docker.com/docker-for-mac/osxfs/#namespaces for more info. .
-
在 docker-compose.yml目录下执行
docker-compose up -d
,如果成功 done -
初始化集群(这一步开始命令须在 redis5.0 及以上版本运行)。
- 创建 3 主 3 从的 redis 集群:
$ redis-cli --cluster create 192.168.99.100:6391 192.168.99.100:6392 192.168.99.100:6393 192.168.99.100:6394 192.168.99.100:6395 192.168.99.100:6396 --cluster-replicas 1
- 创建 3 主 3 从的 redis 集群:
以上是关于docker记录的主要内容,如果未能解决你的问题,请参考以下文章
markdown [Docker] Docker片段列表和命令#linux #docker #snippets
错误记录Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )(代码片段