docker记录

Posted djwhome

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker记录相关的知识,希望对你有一定的参考价值。

docker记录

1.下载

  1. 手动下载安装

    如果需要手动下载,请点击以下链接下载 StableEdge 版本的 Docker for Mac。

    但是上面的地址是国外的,所以特别慢,推荐阿里云mac下载地址,全部系统的docker镜像地址

  2. 查看docker版本
    在终端中输入: docker --version 显示 Docker version 19.03.8, build afacb8b

2.配置

  1. 镜像加速

    • 鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,可用镜像地址:

    • 配置

      • 可以在docker客户端配置-->daemon json配置中加一项:"registry-mirrors": ["https://t5t8q6wn.mirror.aliyuncs.com"]
      • 也可以直接找到daemon.json,文件位置一般位于: /etc/docker/ 或者 ~/.docker/ 目录下,修改为:
      	{
      		"registry-mirrors" : ["https://xxxxxx.mirror.aliyuncs.com"]
      	}
      
    • 不同的配置方式

      1. 拉取的时候,指定镜像的全部地址 $ docker pull registry.docker-cn.com/library/ubuntu
      2. 添加"https://registry.docker-cn.com" 到 registry-mirrors 数组在 /etc/docker/daemon.json ,这样中国镜像变成了默认。
      	{
      	  "registry-mirrors": ["https://registry.docker-cn.com"]
      	}
      
      1. 可以配置docker的守护进程--registry-mirror启动参数 $ dockerd --registry-mirror=https://registry.docker-cn.com
  2. 查看配置

    • docker info 查看docker相关信息
  3. 配置dns

    修改.daemon.json 文件来设置全部容器的dns,需要重启docker才能生效

    	{
    		"dns" : [
    			"114.114.114.114",
    			"8.8.8.8"
    		]
    	} 
    
  4. 登录 和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

  1. 查看可用版本 docker search nginx 命令来查看可用版本
  2. 取最新版的 Nginx 镜像: docker pull nginx:latest
  3. 查看本地是否安装了nginx镜像: docker images
  4. 运行容器: docker run --name test-nginx -p 8080:80 -d nginx:latest
    	--name nginx-test: 容器名称
    	-p 8080:80 端口映射 将本地8080端口映射到容器内部的80端口上
    	-d 加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec(下面会介绍到)
    
  5. 安装成功:访问127.0.0.1:8080 可以看到访问成功界面

3.2安装php

  1. docker search php

  2. docker pull php:7.0-fpm 默认为: docker pull php:latest

  3. mkdir -p ~/docker/nginx/www

  4. 启动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部署

  1. 创建 ~/docker/nginx/conf/conf.d 目录:mkdir -p ~/docker/nginx/conf/conf.d
    mkdir -p ~/docker/nginx/www

  2. 在该目录下添加 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 目录。

  3. 启动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

  1. docker search mysql
  2. docker pull mysql:5.7
  3. 创建所需目录 data logs conf mkdir -p ~/docker/mysql/data ~/docker/mysql/logs ~/docker/mysql/conf
    data 目录将映射为MySQL容器数据文件存放目录
    logs 目录将映射为mysql容器的日志目录
    conf 目录里的配置文件将映射为mysql容器的配置文件
  4. 创建容器 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
  5. 进入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

  1. docker pull phpmyadmin/phpmyadmin这里就按search出来的名字, 一个phpmyadmin会找不到
  2. docker run --name test-phpmyadmin -p 8080:80 --link test-mysql:db -d phpmyadmin/phpmyadmin:latest
  3. 打开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

  1. docker search redis
  2. docker pull redis:latest
  3. docker run -itd --name test-redis -p 6379:6379 redis:latest 创建容器
  4. docker exec -it test-redis /bin/bash 然后再执行 redis-cli进入操作界面

3.8安装redis集群

参考文档

4.docker命令集合

  1. 帮助命令

    • docker
    • docker coomand --help
  2. 操作容器

    • 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进入容器,退出容器终端也不会导致容器停止

  3. 查看容器

    • docker images 查看所有镜像

    • docker ps 查看所有正在运行的容器

    • docker ps -a查看所有容器,包括未运行的

    • docker ps -q静默模式,只显示容器编号

    • docker ps -l 查看最后一次创建的容器信息

  4. 查看更多容器信息

    • 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格式的文件
  5. 删除容器

    • 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)一条命令实现停用并删除容器

  6. 导出/导入容器

    • docker export container id/name > xxx.tar 导出容器到本地目录 一定要加 >
    • cat nignx.tar | docker import - imageName:tag 将外部导入到本地镜像,不是容器哦,容器需要通过本地镜像来生成
    • docker import url 也可以导入远程url或某个目录
  7. 更新镜像
    从已经创建的容器中跟新镜像,并提交这个镜像

    • 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 指定镜像的作者
      
  8. 创建镜像

    1. 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 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
      
    2. docker build -t djw-centos6.7 . -t 指定要创建的镜像名 . Dockerfile文件所在目录,可以指定绝对路径

    3. docker run -it djw-centos6.7 /bin/bash

    4. docker tag image id djw-centos6.7:dev 镜像id 镜像源名 新的tag标签

  9. 容器互联

    1. docker network create -d bridge test-net新建网络 -d 指定网络类型,有 bridge overlay
    2. docker run -itd --name test1 --network test-net ubuntu /bin/bash
      docker run -itd --name test2 --network test-net ubuntu /bin/bash
    3. 这样2个容器都在一个网络中,就可以互相ping了,容器之间建立的互联

5.docker compose

5.1简介

  • Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
  • 如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程
  • Compose 使用的三个步骤:
    1. 使用 Dockerfile 定义应用程序的环境。
    2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
    3. 最后,执行 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 槽。

  1. 下载配置文件,打包好的全部配置 可以直接使用

  2. 要点

    • 多个节点的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. .
  3. 在 docker-compose.yml目录下执行 docker-compose up -d,如果成功 done

  4. 初始化集群(这一步开始命令须在 redis5.0 及以上版本运行)。

    1. 创建 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

以上是关于docker记录的主要内容,如果未能解决你的问题,请参考以下文章

记录C#常用的代码片段

discuz X3.1 源代码阅读,记录代码片段

markdown [Docker] Docker片段列表和命令#linux #docker #snippets

提效小技巧——记录那些不常用的代码片段

用于从 cloudkit 检索单列的代码模式/片段

错误记录Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )(代码片段