Docker 安装与使用

镜像是文件,容器是进程。

容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件。

虚拟化容器技术,Docker 基于镜像,可以秒级启动各种容器,每一种容器都是一个完整的运行环境,容器之间相互隔离。

1、Docker 安装

  1. 利用官方 shell 脚本安装最新版的 docker (通过 --mirror 选项使用国内源进行安装)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  1. 启动 docker 服务
systemctl start docker
  1. 使用 docker version 命令查看 docker 版本,并校验 docker 服务是否启动成功
[root@VM-0-16-centos username] docker version
Client: Docker Engine - Community
 Version:           19.03.13
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        4484c46d9d
 Built:             Wed Sep 16 17:03:45 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.13
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       4484c46d9d
  Built:            Wed Sep 16 17:02:21 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.3.7
  GitCommit:        8fba4e9a7d01810a393d5d25a3621dc101981175
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
  1. 设置 docker 服务为自动启动
systemctl enable docker
  1. 配置阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://dph1a55y.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

2、Docker 卸载

  1. 查看已安装的版本
[root@VM-0-16-centos username] yum list installed|grep docker
containerd.io.x86_64                   1.3.7-3.1.el7                  @docker-ce-stable
docker-ce.x86_64                       3:19.03.13-3.el7               @docker-ce-stable
docker-ce-cli.x86_64                   1:19.03.13-3.el7               @docker-ce-stable
  1. 卸载
yum -y remove containerd.io.x86_64
yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64 

3、Docker 常用命令

3.1、Docker 的镜像管理

  1. 查看镜像列表
docker images
docker image ls
  1. 导出镜像
docker save -o <保存路径> <镜像名称(REPOSITORY):标签(TAG)>
或
docker save > <保存路径> <镜像名称(REPOSITORY):标签(TAG)>

其中 -o> 表示输出到文件,<保存路径> 为目标文件,<镜像名称(REPOSITORY):标签(TAG)> 是源镜像名。

  1. 导入镜像
docker load -i xxx.tar
或
docker load < xxx.tar

其中 -i< 表示从文件输入,会成功导入镜像及相关元数据,包括 tag 信息。

  1. 删除镜像
docker image rm `<镜像名称(REPOSITORY):标签(TAG)> or <IMAGE ID>`
或
docker rmi `<镜像名称(REPOSITORY):标签(TAG)> or <IMAGE ID>`
  1. 搜索镜像
docker search <IMAGE NAME>
  1. 给源中镜像打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag mysql mysql:v1
  1. 推送指定镜像到 Docker 镜像源服务器
docker push <镜像名称(REPOSITORY):标签(TAG)>
  1. 拉取镜像
docker pull <镜像名称(REPOSITORY):标签(TAG)>
  1. 显示一个镜像的历史
docker history <镜像名称(REPOSITORY):标签(TAG)>
  1. 构建镜像

先切换到工程目录中(也就是 Dockerfile 存在的目录)

docker build -t <镜像名称(REPOSITORY):标签(TAG)> .   `(.) 一定不能去掉 # 使用当前目录下的Dockerfile 构建镜像`

3.2、Docker 的容器管理

  1. 查看 docker 版本
docker -v 
  1. 查看 docker 信息
docker info 
  1. 运行容器
docker run -itd --name <自定义容器名称> -p <宿主机端口>:<容器端口> \ 
-v <宿主机文件或文件夹全路径>:<容器内部文件或文件夹全路径> \ # 可多个
<镜像名称(REPOSITORY):标签(TAG)>

详细参数: 
	run			创建并运行一个容器 
	-d 			后台运行 
	-P(大写)  	容器内部端口随机映射到主机端口
	-p(小写)  	容器内部端口绑定到指定的主机端口
	-v 			源地址(宿主机):目标地址(容器) # 挂载目录到宿主机(宿主机全路径)
	-it 		分配交互式的终端 
	--name 		指定容器的名字 
	/bin/sh		覆盖容器的初始命令
  1. 停止容器
docker stop `<CONTAINER ID> or <NAMES>`
  1. 移除容器
docker rm <CONTAINER ID>
		  <NAMES>

docker rm -f  'docker ps -a -q'		# 删除所有容器
  1. 杀死容器
docker kill `<CONTAINER ID> or <NAMES>`
  1. 查看容器列表
docker ps (-a -l -q)
  1. 进入指定容器
docker exec -it `<CONTAINER ID> or <NAMES>` /bin/bash # 退出容器终端,不会导致容器的停止

9.开启/停止/c=重启 指定容器id或者容器名称的容器

docker start/stop/restart `<CONTAINER ID> or <NAMES>`
  1. 查看容器日志
docker logs `<CONTAINER ID> or <NAMES>`
  1. 查看容器状态
docker ps | grep ${CONTAINER_ID}
  1. 镜像打包(保存对容器的修改)
docker commit <CONTAINER ID>  <新的镜像名称(REPOSITORY):标签(TAG)>
	-m="提交的描述信息" 
	-a="作者"
  1. 查看容器内部详情细节
docker inspect `<CONTAINER ID> or <NAMES>`
  1. docker login 登录

  2. Ctrl+P+Q 退出而不关闭容器

4、Docker 安装 MySQL

  1. 使用 docker search mysql 命令查看可用版本
docker search mysql                               
  1. 拉取 MySQL 镜像

拉取官方的最新版本的镜像

docker pull mysql:latest
  1. 创建外部映射目录 conf.d data logs
[root@VM-0-16-centos mysql] pwd
/usr/local/docker/mysql
[root@VM-0-16-centos mysql] ls
conf  data  logs
  1. 启动 MySQL 容器 -p <主机端口>:<容器内部端口>
docker run -p 3306:3306 --name mysql-v1 \
-e MYSQL_ROOT_PASSWORD=123456 \
-itd mysql
  1. 拷贝 mysql-v1 内部配置文件到 conf 目录
docker cp mysql-v1:/etc/mysql/my.cnf /usr/local/docker/mysql/conf/
  1. 停止并移除 mysql-v1 容器
docker stop mysql-v1
docker rm mysql-v1
  1. 修改覆盖 my.cnf 文件
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure-file-priv= /var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8
  1. 启动 MySQL 容器
docker run -p 3306:3306 --name mysql-v1 \
--restart=always \
--privileged=true \
-v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /etc/localtime:/etc/localtime \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql

参数说明

--restart=always:当 Docker 重启时, 容器会自动启动
--privileged=true:容器内的 root 拥有真正 root 权限, 否则容器内 root 只是外部普通用户权限
-v /usr/local/docker/mysql/conf/my.cnf:/etc/mysql/my.cnf:映射配置文件
-v /usr/local/docker/mysql/data:/var/lib/mysql:映射数据目录
-v /usr/local/docker/mysql/logs:/var/log/mysql:映射日志信息
-v /etc/localtime:/etc/localtime:解决容器时间与主机时间不一致

报错问题解决
注意:启动 MySQL 报如下错误,那是因为 MySQL 新特性 secure_file_priv 对读写文件的影响。
mysqld: Error on realpath() on ‘/var/lib/mysql-files’ (Error 2 - No such file or directory)

修改 my.cnf 文件:在 [mysqld] 内加入 secure_file_priv=/var/lib/mysql

  1. 进入 mysql-v1 容器
docker exec -it mysql-v1 /bin/bash
  1. 登录 MySQL
mysql -u root -p
  1. 添加远程登录用户 按需执行
CREATE USER 'yourname'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
GRANT ALL PRIVILEGES ON *.* TO 'yourname'@'%';
  1. 刷新权限
flush privileges;

5、Docker 安装 Redis

Redis 安装包

5.1、不指定配置文件方式启动

  1. 拉取官方的最新版本的镜像
docker pull redis:latest
  1. 查看本地镜像

使用 docker images 命令来查看是否已安装了 Redis

在这里插入图片描述

  1. 运行 Redis 容器
docker run -itd --name redis-v2 -p 6378:6378 redis

在这里插入图片描述

  1. 使用 docker ps 命令查看容器的运行信息

在这里插入图片描述

  1. 通过 redis-cli 连接测试使用 redis 服务
docker exec -it redis-v2 /bin/bash
redis-cli

在这里插入图片描述

5.2、指定配置文件方式启动(与上一步有联系)

  1. 拉取官方的最新版本的镜像 docker pull redis:latest

  2. 查看本地镜像 docker images

  3. 从官网获取 redis.conf 配置文件(注意和自己的 Redis 版本一致)

查看已安装 Redis 的版本

docker exec -it redis-v2 redis-server -v

在这里插入图片描述

  1. 修改默认配置文件 redis.conf
bind 127.0.0.1 		# 注释掉这部分,这是限制 redis 只能本地访问
protected-mode no 	# 默认 yes,开启保护模式,限制为本地访问
daemonize no		# 默认 no,改为 yes 意为以守护进程方式启动,可后台运行,除非 kill 进程(可选),改为 yes 会使配置文件方式启动 redis 失败
dir ./ 				# 输入本地 redis 数据库存放文件夹(可选)
appendonly yes 		# redis 持久化(可选)
  1. 创建 Redis 挂载目录,并将指定版本的 redis.conf 配置文件复制到此目录(上传文件失败,选用 root 用户登陆)
[root@VM-0-16-centos redis] pwd
/usr/local/docker/redis
[root@VM-0-16-centos redis] ls
data  redis.conf

5.使用配置文件启动 Redis

docker run -p 6379:6379 --name redis-v1 \
-v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis/data:/data \
-d redis redis-server /etc/redis/redis.conf \
--appendonly yes

命令解释:

-p 6379:6379 		# 端口映射, 前面表示主机端口:后面表示容器端口
--name redis-v1 	# 指定该容器名称, 方便查看和进行操作
-v 					# 挂载目录, 前面表示主机全路径:后面表示容器全路径
-d redis 			# 表示后台启动 redis
redis-server /etc/redis/redis.conf 		# 以配置文件启动 redis, 加载容器内的 conf 文件, 最终找到的是挂载的目录 /usr/local/docker/redis.conf
appendonly yes 		# 开启 redis 持久化
  1. 运行 docker ps 看一下可以看到 Redis 已经运行成功了,如果没成功请用 docker logs redis-v1 看一下打印日志,99% 为配置文件版本不一致问题

在这里插入图片描述

6、Docker 安装 Nginx

6.1、安装 Nginx

  1. 拉取官方的最新版本的镜像 docker pull nginx:latest

  2. 查看本地镜像 docker images

  3. 启动 Nginx

docker run -itd -p 8080:80 --name nginx-v1 nginx:latest

目录结构

├── conf
│   └── nginx.conf
├── conf.d
│   └── default.conf
├── html
│   └── 1.html
└── logs
    ├── access.log
    └── error.log

执行命令,挂载目录

docker run -itd -p 8080:8080 --name nginx-v1 \
--restart=always \
--privileged=true \
-v /home/qianjinlong/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/qianjinlong/docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf \
-v /home/qianjinlong/docker/nginx/html/:/usr/share/nginx/html/ \
-v /home/qianjinlong/docker/nginx/logs:/var/log/nginx \
nginx:latest

docker run -itd -p 宿主机端口:容器端口 --name 容器名称
-v 宿主机文件或文件夹全路径:容器内部文件或文件夹全路径
镜像名称

查看挂载目录

docker inspect <container_id\container_name> | grep Mounts -A 20
"Mounts": [
    {
        "Type": "bind",
        "Source": "/home/qianjinlong/docker/nginx/html",
        "Destination": "/user/share/nginx/html",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    },
    {
        "Type": "bind",
        "Source": "/home/qianjinlong/docker/nginx/conf/nginx.conf",
        "Destination": "/etc/nginx/nginx.conf",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    },
    {
        "Type": "bind",
        "Source": "/home/qianjinlong/docker/nginx/conf.d/default.conf",
        "Destination": "/etc/nginx/conf.d/default.conf",

修改配置文件

[root@VM-0-16-centos nginx]# cat conf.d/default.conf 
server {
    listen       8080;
    # listen  [::]:8080;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html;
        index  1.html;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

  1. 访问测试
    在这里插入图片描述

未完待续 …

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值