# 一、安装Docker

# 1.windows

在Windows下,docker是默认安装在C盘之下的,

首先使用mklink 进行联接:

C:\Windows\system32>mklink /J "C:\Program Files\Docker" "D:\Program Files\Docker"

运行结果如下:

C:\Program Files\Docker是Docker的默认安装位置,D:\Program Files\Docker是你希望它安装的位置,一旦设立了联接,Docker的安装器会以为它安装在了C:\Program Files\Docker但实际上所有文件都被安装在了D:\Program Files\Docker

注1:希望它安装的位置可以是任意硬盘上已有的盘符,但是C:\Program Files里不能有Docker文件夹否则会出现文件夹已存在的警告并联接失败。 注2:需要在管理员模式下运行。

# 2.linux

安装我们直接使用shell脚本来进行安装,安装脚本的地址如下 get.docker.com

可以直接使用curl命令下载这个shell脚本

curl -fsSL get.docker.com -o get-docker.sh

执行shell脚本

sh get-docker.sh

回车后就开始安装Docker了。这里需要注意,如果你不是root用户,是需要使用sudo命令或者给用户sudo权限。

安装过程大概要3-4分钟左右,也是主要看网速和服务器性能。

检测是否安装成功 (opens new window)

安装完成后,依然通过docker version命令检查是否安装成功。

如果只显示下面的这些信息,也就是只启动了客户端Client

Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:58:10 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

这时候要使用systemctl start命令,开启Docker服务端。

sudo systemctl start docker
systemctl restart docker.service    重启

开启后,再使用sudo docker version来看一下,如果有类似下面的信息,说明已经安装成功了。

Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:58:10 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:56:35 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.8
  GitCommit:        7eba5930496d9bbe375fdf71603e610ad737d2b2
 runc:
  Version:          1.0.0
  GitCommit:        v1.0.0-0-g84113ee
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# 二、创建容器的相关命令

# 创建容器

docker container run < image name >

# 查看容器

docker container ls     或者 docker container ps
CONTAINER ID : 容器对应的ID,这个是唯一的
IMAGE : 使用的镜像名称,显示不同
COMMAND : 执行的相关命令
CREATED: 创建的时间
STATUS: 目前镜像的状态,一般会有两种状态Up和Exited.
PORTS: 协议和端口
NAMES: 容器的名称,名字是Docker随机生成的

# 停止容器

docker container stop <name or ID>   停止单个容器
docker container stop  <ID1  ID2  ID3> 停止多个容器

# 删除容器

docker container rm <name or ID>

# 简写命令

  • 容器的创建:docker container run nginx 简写方法 docker run nginx
  • 容器的列出(up): docker container ls 简写方法docker ps
  • 容器的列出(up和exit):docker container ls -a 简写方法docker ps -a
  • 容器的停止 :docker container stop简写方法 docker stop
  • 容器的删除:docker container rm 简写方法docker rm
  • 容器重命名 docker rename [old_name|container ID] Information-platform-demo

# 查看所有的容器ID

docker container ps -aq

# 组合功能 删除多个容器

docker container rm $(docker container ps -aq)

# 端口映射

docker container run -p 80:80 nginx

第一个端口是映射到服务器本机的端口;第二个端口是Docker容器使用的端口。 比如你想把Docker的80端口,映射到服务器的90端口。

# 运行模式

attached模式在前台运行,detached模式在后台运行。

# attached模式

当你打开127.0.0.1网址的时候,PowerShell上打印出了相关的日志(log),平且每访问一次,都会增加一条日志。也就是说Docker容器的日志会实时的展现到窗口并且占用此端口。这种模式叫做attached模式。

在windows系统下并不是一个完整的attached模式,只是帮我们打印出了Log。现在到Linux服务器上,这时候你按Ctrl+C,就会停止掉Docker服务。而现实中我们工作的环境恰恰是这种Linux环境。

也就是在Linux上你的操作命令,会直接传递个Docker容器

attached模式更适用于容器和程序的调试阶段。

# detached模式

detached模式的开启方法,就是加一个参数-d或者--detach

docker run -d -p 80:80 nginx

detached模式转换attached模式

在运行之后,也有需要调试的时候,Docker提供了两个模式间的转换。比如现在要把detached模式的容器,改为attched模式。

docker  attach <ID or Image Name>

# 查看日志

docker container logs <ID or Image name>

追踪日志

docker container logs -f <ID or Image name>

# docker导出、导入镜像

//导出
docker image save
docker image save busybox:latest -o mybusybox.image

//导入
docker image load -i .\mybusybox.image

# 三、实际操作

# 使用nginx

命令:

一:
docker run --name nginx -p 80:80 -v /home/docker-nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/docker-nginx/log:/var/log/nginx -v /home/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx
二:
docker run --name nginx -p 80:80 
	-v $PWD/nginx.conf:/etc/nginx/nginx.conf
            -v  $PWD/html:/html  
            -v $PWD/logs:/var/log/nginx 
            -v $PWD/conf.d/default.conf:/etc/nginx/conf.d/default.conf 
            -d nginx

nginx项目配置:

注意:nginx.conf配置文件映射到docker容器内部,server中的root路径配置也是相对与容器内部的,所以这里直接将html路径映射到容器的根目录

    server {
        listen       80;
        server_name  demo.gxming.top;
        charset utf-8; 
        location / {
            root   /html/demo-web;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       80;
        server_name  api.gxming.top;
        charset utf-8;
        location / {
            root   /html/api-demo;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

解释下上面的命令:

--name 给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器

-p 映射端口,将docker宿主机的80端口和容器的80端口进行绑定

-v 挂载文件用的,第一个-v 表示将你本地的nginx.conf覆盖你要起启动的容器的nginx.conf文件,第二个表示将日志文件进行挂载,就是把nginx服务器的日志写到你docker宿主机的/home/docker-nginx/log/下面

nginx容器 代理到宿主机服务

  1. 在安装Docker的时候,会在宿主机安装一个虚拟网关 docker0,查询docker0的IP地址

    ip addr show docker0
    
  2. # 注意 upstream 没有http, 这里的ip就是上面对于docker来说宿主机的ip
     upstream music {
            server 172.17.0.1:8080;
        }
        server {
            listen 80;
            # 如果由域名配置为域名即可,如果没有域名配置为本机ip地址
            # 如果想要外部访问就配置为本机的外网ip
            server_name xx.xx.xx.xx;
            location / {
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-Ip $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                # 这里就是上面的upstream
                proxy_pass http://music;
            }
        }
    

# 安装mysql

  • docker search mysql 查询mysql

  • docker pull mysql 拉去镜像 ,也可以指定版本镜像docker pull mysql:8.0.27

  • docker images 查看镜像

  • 在opt目录下创建新文件夹

    命令:cd /opt/
    命令:mkdir mysql_docker
    命令:cd mysql_docker/
    命令:echo $PWD
    
  • 启动mysql容器

    docker run --name mysqlDemoServer -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d -i -p 3306:3306 mysql:latest
    
    Options Mean
    -i 以交互模式运行容器,通常与 -t 同时使用;
    -t 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    -d 后台运行容器,并返回容器ID;
  • 进入mysql 容器 ,并登入mysql

    命令:docker exec -it mysqlserver bash

    命令:mysql -uroot -p

  • 开启远程访问权限

    须先到服务器开启3306端口

    命令:use mysql;

    命令:select host,user from user;

    命令:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

    命令:flush privileges;

  • 查看日志 docker logs -f --tail 10 a4dac74d48f7

  • 查看进程 docker ps -a

  • 重启docker systemctl restart docker

  • 查看docker是否启动成功 ps -ef|grep docker

  • 关闭docker systemctl stop docker

# 安装redis

docker run -p 6379:6379 --name redis -v $PWD/redis.conf:/etc/redis/redis.conf -v $PWD/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

# 安装portainer

docker search portainer

# 四、实际操作

# 备份数据库

sudo docker exec 容器 sh -c 'exec mysqldump --all-databases -u账号 -p密码 --all-databases' > /home/music_`date +%F`.sql

# 容器还原

#复制备份文件到容器中的var目录
sudo docker cp /var/backup/emp_2022-03-17.sql mysql:/var
#进入容器
sudo docker exec -it mysql bin/bash
#进入mysql
mysql -uroot -p
#使用备份sql恢复数据库
source /var/backup/emp_2022-03-15.sql

#或者不进入mysql直接容器中还原
mysql -uroot -p123456 < /var/backup/emp_2022-03-15.sql

参考文章 (opens new window)

更新时间: 2023/07/26 星期三 12:02:31