Docker部署

部署Docker

1.部署docker相关

此章描述在新的服务器上安装docker容器。

1.1 概述

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

1.2 软件环境配置

Centos7.0 64位

Vmware workstation 16.1

1.3 安装docker

1.3.1 yum安装

CentOS 7 (使用 yum 进行安装)

step 1: 安装必要的一些系统工具

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Step 2: 添加软件源信息

sudo yum-config-manager –add-repo https: //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

Step 3: 更新并安装Docker-CE

sudo yum makecache fast

sudo yum -y install docker-ce

Step 4: 开启Docker服务

sudo service docker start

1.3.2 使用官方安装脚本自动安装

安装命令如下:

curl -fsSL https://get.docker.com | bash -s docker --mirror aliyun

也可以使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

1.3.3 手动安装

卸载旧版本

较旧的 Docker 版本称为 docker 或 docker-engine 。如果已安装这些程序,请卸载它们以及相关的依赖项。

$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

1.3.4 使用 Docker 仓库进行安装

在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库。之后,您可以从仓库安装和更新 Docker。

1、设置仓库

安装所需的软件包。yum-utils 提供了 yum-config-manager ,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2。

$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

使用以下命令来设置稳定的仓库。

官方源地址(比较慢)

$ sudo yum-config-manager \
–add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

可以选择国内的一些源地址:

阿里云

$ sudo yum-config-manager \
–add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

清华大学源

$ sudo yum-config-manager \
–add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

2、安装 Docker Engine-Community

安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本:

$ sudo yum install docker-ce docker-ce-cli containerd.io

如果提示您接受 GPG 密钥,请选是。

有多个 Docker 仓库吗?

如果启用了多个 Docker 仓库,则在未在 yum install yum update 命令中指定版本的情况下,进行的安装或更新将始终安装最高版本,这可能不适合您的稳定性需求。

Docker 安装完默认未启动。并且已经创建好 docker 用户组,但该用户组下没有用户。

要安装特定版本的 Docker Engine-Community,请在存储库中列出可用版本,然后选择并安装:

1、列出并排序您存储库中可用的版本。此示例按版本号(从高到低)对结果进行排序。

$ yum list docker-ce –showduplicates | sort -r

docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable

2、通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

启动 Docker。

$ sudo systemctl start docker

通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community

$ sudo docker run hello-world

1.4 安装报错及解决

错误内容

本人安装时遇到的报错(具体以实际情况为准)

package docker-ce-3:19.03.2-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed

  • cannot install the best candidate for the job

  • package containerd.io-1.2.2-3.3.el7.x86_64 is excluded

  • package containerd.io-1.2.2-3.el7.x86_64 is excluded

  • package containerd.io-1.2.4-3.1.el7.x86_64 is excluded

  • package containerd.io-1.2.5-3.1.el7.x86_64 is excluded

  • package containerd.io-1.2.6-3.3.el7.x86_64 is excluded

(try to add ‘–skip-broken’ to skip uninstallable packages or ‘–nobest’ to use not only best candidate packages)

原因分析

containerd.io >= 1.2.2-3 ,意思是 containerd.io 的版本必须大于等于 1.2.2-3

解决

更新 containerd.io 的版本

(尝试添加’–skip-broken’以跳过可卸载的软件包,或者添加’–nobest’以不仅使用最佳候选软件包))

1.#下载containerd.io

wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

2.#安装containerd.io

yum install -y containerd.io-1.2.6-3.3.el7.x86_64.rpm

3.#继续6.2安装步骤

重新安装最新版本的docker

引用:https://www.cnblogs.com/Gdavid/p/13030007.html

1.5 安装校验

docker version

显示如下信息则为安装成功

[Work-HN-001 ~]$ sudo docker version

Client: Docker Engine – Community

Version: 19.03.12

API version: 1.40

Go version: go1.13.10

Git commit: 48a66213fe

Built: Mon Jun 22 15:46:54 2020

OS/Arch: linux/amd64

Experimental: false

Server: Docker Engine – Community

Engine:

Version: 19.03.12

API version: 1.40 (minimum version 1.12)

Go version: go1.13.10

Git commit: 48a66213fe

Built: Mon Jun 22 15:45:28 2020

OS/Arch: linux/amd64

Experimental: false

containerd:

Version: 1.2.6

GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb

runc:

Version: 1.0.0-rc8

GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f

docker-init:

Version: 0.18.0

GitCommit: fec3683

引用阿里巴巴镜像站社区技术文章

2、配置openresty

2.1 概述

OpenResty(又称:ngx_openresty) 是一个基于 nginx的可伸缩的 Web 平台,由中国人章亦春发起,提供了很多高质量的第三方模块。

OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。360,UPYUN,阿里云,新浪,腾讯网,去哪儿网,酷狗音乐等都是 OpenResty 的深度用户。

OpenResty 简单理解成 就相当于封装了nginx,并且集成了LUA脚本,开发人员只需要简单的其提供了模块就可以实现相关的逻辑,而不再像之前,还需要在nginx中自己编写lua的脚本,再进行调用了。

2.2 docker部署

2.2.1 拉取镜像

docker pull sevenyuan/openresty

2.2.2 启动openresty

docker run -id –name openresty -p 80:80 sevenyuan/openresty

2.2.3 创建挂载目录

mkdir -p /opt/docker/openresty

2.2.4 将容器内的初始配置拷贝

docker cp openresty:/usr/local/openresty /opt/docker/

2.2.5 删除 openresty 容器

docker rm -f 容器ID

2.2.6 挂载方式启动

docker run -id -p 80:80 \

–name openresty –restart always –privileged=true \

-v /opt/docker/openresty/nginx/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf \

-v /opt/docker/openresty/nginx/logs:/usr/local/openresty/nginx/logs \

-v /etc/localtime:/etc/localtime \

sevenyuan/openresty

/etc/localtime 是用来描述本机时间

2.2.7 测试是否成功

curl 127.0.0.1

Docker部署

3、配置Nginx

3.1 简介

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。

3.2 nginx 环境安装配置

3.2.1 安装

Centos7 环境下安装:

一、配置 EPEL源

sudo yum install -y epel-release

sudo yum -y update

二、安装Nginx

sudo yum install -y nginx

安装成功后,默认的网站目录为: /usr/share/nginx/html

默认的配置文件为:/etc/nginx/nginx.conf

自定义配置文件目录为: /etc/nginx/conf.d/

Ubuntu 环境下安装:

# 更新源及安装

apt update && apt install nginx -y

# 查看nginx版本

nginx -v

3.2.2 启动nginx服务

你可以使用以下命令来启动nginx服务器:

## 启动 nginx 服务

#service nginx start

我们需要通过以下命令来检查Nginx服务器是否启动:

#service nginx status

如果是 * nginx is running提示,则代表Ngnix服务正常运行。

使用浏览器访问此机器的 IP,看到如下所示的字样,就代表nginx已经正确被访问到了。

3.2.3 启动,停止和重新加载Nginx配置

要启动nginx,请运行可执行文件。 当nginx启动后,可以通过使用-s参数调用可执行文件来控制它。 使用以下语法:

#nginx -s signal

信号(signal)的值可能是以下之一:

  • stop – 快速关闭服务
  • quit – 正常关闭服务
  • reload – 重新加载配置文件
  • reopen – 重新打开日志文件

例如,要通过等待工作进程完成服务当前请求来停止nginx进程,可以执行以下命令:

#nginx -s quit

注:该命令应该在启动nginx的同一用户下执行。

在将重新配置命令的命令发送到nginx或重新启动之前,配置文件中的更改将不会被应用。 要重新加载配置文件,请执行:

#nginx -s reload

当主进程收到要重新加载配置的信号,它将检查新配置文件的语法有效性,并尝试应用其中提供的配置。 如果这是成功的,主进程将启动新的工作进程,并向旧的工作进程发送消息,请求它们关闭。 否则,主进程回滚更改,并继续使用旧配置。 老工作进程,接收关闭命令,停止接受新连接,并继续维护当前请求,直到所有这些请求得到维护。 之后,旧的工作进程退出。

还可以借助Unix工具(如kill utility)将信号发送到nginx进程。 在这种情况下,信号直接发送到具有给定进程ID的进程。 默认情况下,nginx主进程的进程ID写入目录/usr/local/nginx/logs或/var/run中的nginx.pid。 例如,如果主进程ID为1628,则发送QUIT信号导致nginx的正常关闭,请执行:

**#kill -s QUIT pidof nginx**

要获取所有运行的nginx进程的列表,可以使用ps命令,例如,以下列方式:

#ps -ax | grep nginx

4、配置MySQL

4.1 简介

MySQL 是最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。

MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。

MySQL由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。

本教程的系统平台:CentOS release 6.6 (Final) 64位。

4.2 安装编译工具及库文件

yum -y install gcc gcc-c++ make autoconf libtool-ltdl-devel gd-devel freetype-devel libxml2-devel libjpeg-devel libpng-devel openssl-devel curl-devel bison patch unzip libmcrypt-devel libmhash-devel ncurses-devel sudo bzip2 flex libaio-devel

4.3 安装cmake 编译器

cmake 版本:cmake-3.1.1。

1、下载地址:http://www.cmake.org/files/v3.1/cmake-3.1.1.tar.gz

$ wget http://www.cmake.org/files/v3.1/cmake-3.1.1.tar.gz

2、解压安装包

$ tar zxvf cmake-3.1.1.tar.gz

3、进入安装包目录

$ cd cmake-3.1.1

4、编译安装

$ ./bootstrap

$ make && make install

4.4 安装 MySQL

MySQL版本:mysql-5.6.15。

1、下载地址: http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz

$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.15.tar.gz

2、解压安装包

$ tar zxvf mysql-5.6.15.tar.gz

3、进入安装包目录

$ cd mysql-5.6.15

4、编译安装

$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local/webserver/mysql/ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_INNODB_MEMCACHED=1 -DWITH_DEBUG=OFF -DWITH_ZLIB=bundled -DENABLED_LOCAL_INFILE=1 -DENABLED_PROFILING=ON -DMYSQL_MAINTAINER_MODE=OFF -DMYSQL_DATADIR=/usr/local/webserver/mysql/data -DMYSQL_TCP_PORT=3306

$ make && make install

5、查看mysql版本:

$ /usr/local/webserver/mysql/bin/mysql –version

到此,mysql安装完成。

4.5 MySQL 配置

4.5.1 创建mysql运行使用的用户mysql:

$ /usr/sbin/groupadd mysql

$ /usr/sbin/useradd -g mysql mysql

4.5.2 创建binlog和库的存储路径并赋予mysql用户权限

$ mkdir -p /usr/local/webserver/mysql/binlog /www/data_mysql

$ chown mysql.mysql /usr/local/webserver/mysql/binlog/ /www/data_mysql/

4.5.3 创建my.cnf配置文件

将/etc/my.cnf替换为下面内容

$ cat /etc/my.cnf

[client]

port = 3306

socket = /tmp/mysql.sock

[mysqld]

replicate-ignore-db = mysql

replicate-ignore-db = test

replicate-ignore-db = information_schema

user = mysql

port = 3306

socket = /tmp/mysql.sock

basedir = /usr/local/webserver/mysql

datadir = /www/data_mysql

log-error = /usr/local/webserver/mysql/mysql_error.log

pid-file = /usr/local/webserver/mysql/mysql.pid

open_files_limit = 65535

back_log = 600

max_connections = 5000

max_connect_errors = 1000

table_open_cache = 1024

external-locking = FALSE

max_allowed_packet = 32M

sort_buffer_size = 1M

join_buffer_size = 1M

thread_cache_size = 600

thread_concurrency = 8

query_cache_size = 128M

query_cache_limit = 2M

query_cache_min_res_unit = 2k

default-storage-engine = MyISAM

default-tmp-storage-engine=MYISAM

thread_stack = 192K

transaction_isolation = READ-COMMITTED

tmp_table_size = 128M

max_heap_table_size = 128M

log-slave-updates

log-bin = /usr/local/webserver/mysql/binlog/binlog

binlog-do-db=oa_fb

binlog-ignore-db=mysql

binlog_cache_size = 4M

binlog_format = MIXED

max_binlog_cache_size = 8M

max_binlog_size = 1G

relay-log-index = /usr/local/webserver/mysql/relaylog/relaylog

relay-log-info-file = /usr/local/webserver/mysql/relaylog/relaylog

relay-log = /usr/local/webserver/mysql/relaylog/relaylog

expire_logs_days = 10

key_buffer_size = 256M

read_buffer_size = 1M

read_rnd_buffer_size = 16M

bulk_insert_buffer_size = 64M

myisam_sort_buffer_size = 128M

myisam_max_sort_file_size = 10G

myisam_repair_threads = 1

myisam_recover

interactive_timeout = 120

wait_timeout = 120

skip-name-resolve

master-connect-retry = 10

slave-skip-errors = 1032,1062,126,1114,1146,1048,1396

master-host = 192.168.1.2

master-user = username

master-password = password

master-port = 3306

server-id = 1

loose-innodb-trx=0

loose-innodb-locks=0

loose-innodb-lock-waits=0

loose-innodb-cmp=0

loose-innodb-cmp-per-index=0

loose-innodb-cmp-per-index-reset=0

loose-innodb-cmp-reset=0

loose-innodb-cmpmem=0

loose-innodb-cmpmem-reset=0

loose-innodb-buffer-page=0

loose-innodb-buffer-page-lru=0

loose-innodb-buffer-pool-stats=0

loose-innodb-metrics=0

loose-innodb-ft-default-stopword=0

loose-innodb-ft-inserted=0

loose-innodb-ft-deleted=0

loose-innodb-ft-being-deleted=0

loose-innodb-ft-config=0

loose-innodb-ft-index-cache=0

loose-innodb-ft-index-table=0

loose-innodb-sys-tables=0

loose-innodb-sys-tablestats=0

loose-innodb-sys-indexes=0

loose-innodb-sys-columns=0

loose-innodb-sys-fields=0

loose-innodb-sys-foreign=0

loose-innodb-sys-foreign-cols=0

slow_query_log_file=/usr/local/webserver/mysql/mysql_slow.log

long_query_time = 1

[mysqldump]

quick

max_allowed_packet = 32M

4.5.4 初始化数据库

$/usr/local/webserver/mysql/scripts/mysql_install_db –defaults-file=/etc/my.cnf –user=mysql

显示如下信息:

Installing MySQL system tables…2015-01-26 20:18:51 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).

OK

Filling help tables…2015-01-26 20:18:57 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use –explicit_defaults_for_timestamp server option (see documentation for more details).

OK

4.5.5 创建开机启动脚本

$ cd /usr/local/webserver/mysql/

$ cp support-files/mysql.server /etc/rc.d/init.d/mysqld

$ chkconfig –add mysqld

$ chkconfig –level 35 mysqld on

4.5.6 启动mysql服务器

$ service mysqld start

4.5.7 连接 MySQL

$ /usr/local/webserver/mysql/bin/mysql -u root -p

4.5.8 修改MySQL用户密码

mysqladmin -u用户名 -p旧密码 password 新密码

或进入mysql命令行

SET PASSWORD FOR ‘用户名’@’主机’ = PASSWORD(‘密码’);

创建新用户并授权:

grant all privileges on . to 用户名@’%’ identified by ‘密码’ with grant option;

4.6 其他命令

启动: # service mysqld start

停止: # service mysqld stop

重启: # service mysqld restart

重载配置: # service mysqld reload

转载自:https://www.runoob.com/linux/mysql-install-setup.html

5、镜像的获取与容器的使用

# 搜索镜像

docker search # 在docker index中搜索image

# 下载镜像

docker pull # 从docker registry server 中下拉image

# 查看镜像

docker images # 列出images

docker images -a # 列出所有的images(包含历史)

docker rmi# 删除一个或多个image

使用镜像创建容器

docker run -i -t sauloal/ubuntu14.04

docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭

docker run -itd –name centos_aways –restart=always centos #创建一个名称centos_aways的容器,自动重启

–restart参数:always始终重启;on-failure退出状态非0时重启;默认为,no不重启

查看容器

docker ps :列出当前所有正在运行的container

docker ps -l :列出最近一次启动的container

docker ps -a :列出所有的container(包含历史,即运行过的container)

docker ps -q :列出最近一次运行的container ID

再次启动容器

docker start/stop/restart

docker start [container_id] #:再次运行某个container (包括历史container)

进入正在运行的docker容器

docker exec -it [container_id] /bin/bash

docker run -i -t -p

删除容器

docker rm

docker rm docker ps -a -q #:删除所有的container

docker ps -a -q | xargs docker rm #:同上, 删除所有的container

docker run 和 docker create 参数基本一样,run是创建容器并后台启动,create是只创建容器。

docker run 相当于docker create 和 docker start

run创建容器:docker run -itd

create创建: docker create -it

-t, –tty Allocate a pseudo-TTY

-i, –interactive Keep STDIN open even if not attached

-d, –detach Run container in background and print container ID #run的参数

容器资源限制参数

-m 1024m –memory-swap=1024m # 限制内存最大使用(bug:超过后进程被杀死)

–cpuset-cpus=”0,1″ # 限制容器使用CPU

docker 容器随系统自启参数

docker run –restart=always redis

no – 默认值,如果容器挂掉不自动重启

on-failure – 当容器以非 0 码退出时重启容器

同时可接受一个可选的最大重启次数参数 (e.g. on-failure:5).

always – 不管退出码是多少都要重启

docker run -itd –name test01 -p IP:sport:dport -m 1024m –memory-swap=1024m –cpuset-cpus=”0,1″ –restart=always

docker exec -it test01 bash # 进入容器也可以用exec命令

查看容器状态信息

[root@localhost ~] # docker stats

[root@localhost ~] # docker stats –no-stream

5.1.1 启动 docker

[root@chaols ~]# systemctl start docker

5.1.2 查看 docker 镜像

刚刚安装docker是没有镜像的

[root@chaols ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

5.1.3 下载 centos 镜像

[root@chaols ~]# docker pull centos

默认centos镜像没有ifconfig

5.1.4 自定义 dockerfile 文件

FROM centos

ENV MYPATH /usr/local

WORKDIR $MYPATH

RUN yum install -y net-tools

RUN yum install -y vim

EXPOSE 80

CMD echo $MYPATH

CMD echo “—–end—–“

CMD /bin/bash”

5.1.5 开始制作

docker build -f ./dockerfile_chao_centos -t chao.centos:0.1 .

5.1.6 创建虚拟机

root@chaols ~]# docker run -it –name test chao.centos:0.1 /bin/bash

5.1.7 验证 ifconfig

[root@f5be14eebc1e local]# ifconfig

eth0: flags=4163mtu 1500

inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255

ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)

RX packets 6 bytes 516 (516.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

loop txqueuelen 1000 (Local Loopback)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

5.2 进入容器 – nsenter 命令

5.2.1 nsenter安装

nsenter 工具在 util-linux 包2.23版本后包含。 如果系统中 util-linux 包没有该命令,可以按照下面的方法从源码安装。

cd /usr/src ; wget https://www.kernel.org/pub/linux/utils/util-linux/v2.28/util-linux-2.28.tar.gz

./configure –without-ncurses

make nsenter && sudo cp nsenter /usr/local/bin

5.2.2 nsenter使用

nsenter 可以访问另一个进程的名字空间。nsenter 要正常工作需要有 root 权限。为了连接到容器,你还需要找到容器的第一个进程的 PID,可以通过下面的命令获取。

PID=$(docker inspect –format “{{ .State.Pid }}”

通过这个 PID,就可以连接到这个容器:

nsentertarget $PIDmountutsipcnetpid

更简单的,建议下载 .bashrc_docker,并将内容放到 .bashrc 中。

wget -P ~ https://github.com/yeasy/docker_practice/raw/master/_local/.bashrc_docker;

echo “[ -f ~/.bashrc_docker ] && . ~/.bashrc_docker” >> ~/.bashrc; source ~/.bashrc

这个文件中定义了很多方便使用 Docker 的命令,例如 docker-pid 可以获取某个容器的 PID;而

docker-enter 可以进入容器或直接在容器内执行命令。

echo $(docker-pid

docker-enter

docker-enter

5.3 持久化容器与镜像

5.3.1 通过容器生成新的镜像

运行中的镜像称为容器。你可以修改容器(比如删除一个文件),但这些修改不会影响到镜像。不过,你使用docker commit 命令可以把一个正在运行的容器变成一个新的镜像。

docker commit

5.3.2 持久化容器

export命令用于持久化容器

docker export

5.3.3 持久化镜像

Save命令用于持久化镜像

docker save 镜像ID > /tmp/save.tar

5.3.4 导入持久化container

删除container 2161509ff65e

docker rm 2161509ff65e

导入export.tar文件

cat /tmp/export.tar | docker import – export:latest

5.3.5 导入持久化image

删除image daa11948e23d

docker rmi daa11948e23d

导入save.tar文件

docker load < /tmp/save.tar

对image打tag

docker tag daa11948e23d load:tag

5.4 export-import与save-load的区别

导出后再导入(export-import)的镜像会丢失所有的历史,而保存后再加载(save-load)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚。(可以执行docker tag 来回滚之前的层)。

5.5 一些其它命令

docker logs $CONTAINER_ID #查看docker实例运行日志,确保正常运行

docker inspect $CONTAINER_ID #docker inspect

docker build

docker build -t repo[:tag] 同上,可以指定repo和可选的tag

docker build – <

docker port

5.6 docker文件存放目录

Docker实际上把所有东西都放到/var/lib/docker路径下了。

[root@localhost docker] # ls -F

containers/ devicemapper/ execdriver/ graph/ init/ linkgraph.db repositories-devicemapper volumes/

containers目录当然就是存放容器(container)了,graph目录存放镜像,文件层(file system layer)存放在graph/imageid/layer路径下,这样我们就可以看看文件层里到底有哪些东西,利用这种层级结构可以清楚的看到文件层是如何一层一层叠加起来的。

5.7 docker使用小技巧

5.7.1 清理全部停止的docker容器

有时候我们会有很多已经停止的容器或者由于错误强制退出不能用的容器,那我们就需要删除了,但是我们一个一个的rm删除很麻烦,有多少容器就要rm多少次,我们可以根据docker ps -qa 查出所有容器的id,一次性全部删除,不用担心会删除正在运行的容器,运行中的容器rm无法删除,这样我们就一次性把所有停止的容器删除了

只适用于Linux环境下

docker rm $(docker ps -qa)

5.7.2 查看镜像中得环境变量

当我们制作好一个镜像或者获取到一个镜像之后如果我们想知道他的环境变量,我们首先想到的就是创建容器看看就知道了,其实不必,我们可以直接通过env查看

docker run nginx env

Docker部署

Windows 上和Linux的区别

这两种环境的区别主要原因还是docker的支持问题,我们都知道docker最开始是在Linux上发行的,依赖于Linux内核,但是Windows上没有,那么我们现在是怎么用的呢,虚拟机,如果是win10以下版本基本上装的都是VirtualBox,win10的很多都会选择桌面版的,使用的Hyper-V ,也是虚拟机的一种。只有有了虚拟机之后docker才能在windows上使用,到这里我们应该知道两种不同之处了

在Linux上docker直接就在Linux系统上的,但是在windows上不同,windows系统上是虚拟机,虚拟机上才是docker

Linux系统 << docker容器

win系统 << 虚拟机 << docker容器

也就是这种原因,导致我们在使用的过程中有略微的不同,最常见的就是开端口的时候

Linux系统:docker容器端口直接映射到Linux系统

windows系统:docker容器端口映射到虚拟机,再由虚拟机映射到我们的windows

注: 把我们虚拟机中选择网络的时候选择网络地址转换(NAT),这样我们就不用考虑中间虚拟机到windows这层的端口映射问题了

5.7.3 挂载

在使用Docker的时候很多人都喜欢制作镜像,把应用直接打包到镜像中,直接启动镜像,一切OK,但是避免不了的是我们有时候会做一些细微的修改,特别是配置文件或者是一些项目中微小的修改,这种时候我们还是要重新做镜像吗?答案是不需要的,没有必要

我们前端使用nginx镜像部署,但是发布之后发现有一点样式需要微调,那么我们是不是还需要重新制作一个镜像呢,这样我们会不会感觉很麻烦(至少我会感觉很麻烦),想想我们只需要把修改过的文件把容器中的文件覆盖就行了,怎么样才能直接把修改过的文件覆盖容器中的文件,两种办法:第一直接把文件cp到容器中,这个过程我们还是要操作容器,怎么才能不动容器呢?挂载 我们可以在启动容器的时候直接把会在后面修改的东西挂载到宿主机上,这样我们就不用动容器了,启动的时候使用-v参数挂载宿主机文件或目录到容器

docker run -d -p 80:80 -v /c/Users/SunArmy/Desktop/html:/usr/share/nginx/html nginx

Docker部署

Docker部署

我们随便写一个index.html里面写上welcome nginx

把这个文件覆盖/opt/docker/html/下的index.html

再访问

Docker部署

重启都不需要直接OK

为什么不选择直接cp到容器中

有这样一种情况,如果你需要修改的是配置文件,这肯定是需要重启的,但是在修改的时候不小心把配置文件写错了,这个时候你的容器就起不来了,想要修改容器中的配置,那也做不到了(除非重新创建容器),换种做法,如果我们把配置文件挂载在外面当你启动不起来的时候你可以直接在宿主机上修改为正确配置重启启动即可,综上,挂载的方式比cp到容器中的方式方便且安全

5.7.4 jq工具

最后介绍一个操作json的工具,这个是在查看容器配置的时候用的,我们使用docker inspect ID查看容器配置,往往会过滤出来一些我们关注的信息,一般情况下我们会选择docker inspect –format= 或者使用grep

但是无论使用哪一种都没有我们最熟悉的操作json的方式来过滤用着爽

jq工具需要单独安装yum install jq

1、使用jq过滤docker inspect 获取地址

docker inspect ac |jq -r .[0].NetworkSettings.IPAddress

. 代表管道前面的输出,之后的[0]就是数组的第1个元素,后面的 . 就是类似于点出对象中的属性一样,跟我们平时使用json是一样的,jq还能方便的格式化查看json文件,对于在命令行下查看json文件简直是利器

Docker部署

2、修改Docker本地镜像和容器的存储位置

很多人都是只知道创建了容器,从来没有关注过创建的容器在哪?本地镜像在哪?

但是,当你不得不关注的时候往往就是你的docker镜像和容器把你的盘装满了

查看Docker镜像和容器存储的位置

docker info |greo Docker

默认位置就是:/var/lib/docker

修改存储位置的方法有两种:

一):通过建立软连接,把/var/lib/docker 移动到其他地方,建立到这里的软连接

停止docker

service docker stop

移动/var/lib/docker 到/usr/local/

mv /var/lib/docker /usr/local/

建立软连接

ln -s /usr/local/docker /var/lib/docker

启动Docker

service docker start

这个时候我们已经修改了,但是查看位置的时候看到的位置还是/var/lib/docker

但是这是个链接,可以查看大小发现是空的,真实的存储位置已经成为了/usr/local/docker

查看/var/lib/docker目录大小

du -dh /var/lib/docker

二):修改配置文件

默认配置文件/etc/docker/daemon.json

如果没有的话就自己创建

{

“registry-mirrors”: [“http://hub-mirror.c.163.com”],

“graph”:”/opt/docker”

}

直接修改 graph 的值为你的位置然后重启,OK

启动

service docker stop

停止

service docker start

重启

service docker restart

再查看docker的存储位置,已经修改成功

6、示例

6.1 导入docker镜像

将打包好的镜像文件从本地通过Xftp上传至部署服务器,执行导入命令,导入镜像不分先后顺序。

导入命令

cd进入镜像所在文件夹

sudo docker import – mysql:5.7 < mysql.tar

sudo docker import – redis < redis.tar

sudo docker import – php:7.2-fpm < myphp.tar

sudo docker import – tomcat < tomcat.tar

sudo docker import – resty001 < resty.tar

注意:导入resty镜像时,’import – resty001’中的镜像名称’resty001’,需要与文件data/openresty/init_docker_openresty.sh初始化脚本中的一致,否则无法启动。

Docker部署

6.2 查看镜像

命令:docker images

[Work-HN-001 ~]$ sudo docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

resty latest d8fe2a29e417 3 days ago 83.2MB

tomcat latest c73fb800828c 3 days ago 734MB

php 7.2-fpm 621f64d53c17 3 days ago 507MB

redis latest cd2429c53c55 3 days ago 94.8MB

mysql 5.7 639be76a6d1a 3 days ago 412MB

6.3 运行docker容器

运行初始化脚本,此脚本不会启动resty:

./init_docker_container.sh

运行resty初始化脚本,目录data/openresty:

./ init_docker_openresty.sh

6.4 查看容器

命令:docker ps

输入后显示的列名及说明如下:

CONTAINER ID: 容器 ID。

IMAGE: 使用的镜像。

COMMAND: 启动容器时运行的命令。

CREATED: 容器的创建时间。

STATUS: 容器状态。

PORTS: 端口

NAMES: 容器名

Docker部署

容器正在运行,未停止为正常状态。

6.4.1 查看容器IP及配置

先查询容器IP将ip配置到对应的文件位置中;

命令:docker inspect –format='{{.NetworkSettings.IPAddress}}’ tomcat8080

Docker部署

6.4.2 配置tomcat的ip

配置文件位置:/data/openresty/conf.d/01default.conf

172.17.0.6,配置8080端口

Docker部署

6.4.3 配置php的ip

配置文件位置:/data/openresty/conf.d/01default.conf

172.17.0.2,配置9000端口

Docker部署

6.4.4 配置redis的ip

配置文件位置:

/data/tomcat8080/webapps/cims/WEB-INF/classes/application.yml

172.17.0.5

Docker部署

新增加添加下面地址,或直接使用最新文件

application.yml文件最底下加上物联网视频监控地址

httpRtmpUrls: http://127.0.0.1:8080/flv?app=live&stream=

Docker部署

6.4.5 配置mysql的ip

配置文件位置:

/data/tomcat8080/webapps/cims/WEB-INF/classes/application-druid.yml

172.17.0.3,端口3306

Docker部署

6.4.6 配置服务器的ip

配置文件位置:/data/openresty/conf.d/01default.conf

配置文件两处配置服务器的ip:47.112.177.142

Docker部署

6.5 重启docker服务

输入命令:./restart_lnmp.sh

Docker部署

等待重启完成后,登录服务器地址,查看项目正常运行:

http://服务器ip/cims/v3/#/login

7.Docker 容器配置独立IP

一般安装docker后都会通过端口转发的方式使用网络,比如 “-p 2294:22” 就将2294抓发到22端口来提供sftp服务,这样使用起来没有问题。但端口号很难记忆,如果前边有nginx等抓发工具,可以将2294再转回22,但有没有方法直接给docker容器配置独立ip地址呢?

以下两种方式都需要安装pipework

其作用是指定物理网段容器IP地址

1

2

3

4

5

6

cd /usr/src

若没有wget命令,安装 yum install -y wget

wget -O pipework-master.zip https://codeload.github.com/jpetazzo/pipework/zip/master

若没有unzip命令,安装 yum install -y unzip zip

unzip pipework-master.zip

cp -p pipework-master/pipework /usr/local/bin/

以下两个种方式重启后ip地址都会丢失,所以每次重启后都要重新分配ip地址

7.1 通过虚拟网卡br0桥接

7.1.1 修改宿主机物理网卡配置

1

vi /etc/sysconfig/network-scripts/ifcfg-em1

修改两个配置

1

2

BOOTPROTO=none # 配置不启动dhcp

BRIDGE=br0 # 配置网桥

Docker部署

7.1.2 增加网桥设备 br0

1

vi /etc/sysconfig/network-scripts/ifcfg-br0

在其中增加如下内容

1

2

3

4

DEVICE=br0

ONBOOT=yes

TYPE=Bridge

BOOTPROTO=dhcp

配置完成后重新启动网络,此时 br0 设备就使用的物理网卡 em1 作为桥接通信。

7.1.3 创建容器(创建了一个centos7的容器)

1

docker run -itd –net=none –name=test01 ansible/centos7-ansible /bin/bash # 其中 –net=none不设置网络

7.1.4 给创建的容器制定物理IP地址

1

2

pipework br0 test01 192.168.2.235/24@192.168.2.1

网桥 容器名 IP地址 网关地址

7.1.5 进入容器查看ip地址

1

2

3

docker exec -it test01 /bin/bash # 进入test01容器

yum install -y net-tools # 安装ifconfig

ifconfig

此时就应该看到配置的 192.168.2.235 这个ip。

此种方法的问题是,之后每个容器都需要指定一个ip地址。

7.2 通过物理网卡桥接

7.2.1 绑定物理ip

1、创建容器(创建了一个centos7的容器)

1

docker run -itd –net=none –name=test02 ansible/centos7-ansible /bin/bash # 其中 –net=none不设置网络

2、给创建的容器制定物理IP地址,其中eth0跟据实际情况修改

1

2

pipework eth0 test02 192.168.2.234/24@192.168.2.1

网桥 容器名 IP地址 网关地址

3、进入容器查看ip地址

1

2

3

docker exec -it test02 /bin/bash # 进入test01容器

yum install -y net-tools # 安装ifconfig

ifconfig

此时就应该看到配置的 192.168.2.234 这个ip。

此种方法的问题是,之后每个容器都需要指定一个ip地址。

7.2.2 使用内网地址172.x.x.x

1、创建容器(创建了一个centos7的容器)

1

docker run -itd –name=test03 ansible/centos7-ansible /bin/bash

2、进入容器查看ip地址

1

2

3

docker exec -it test03 /bin/bash # 进入test01容器

yum install -y net-tools # 安装ifconfig

ifconfig

7.2.3 重启后固定ip

以上防范重启后需要使用shell脚本的方式重新分配ip地址,也可使用 docker-static-ip 固定ip。实现与pipework一样,只是用Python把整个指定的IP的操作变成后台进程,把 [容器,网桥,IP地址,网关]写进containers.cfg 。

程序会根据配置文件来自动设置容器的IP地址,每10秒检查一次,如果有新增的就会自动设置。

当重启容器时,IP地址消失,程序会根据配置文件再次自动分配。

8、Docker服务报错

8.1 Cannot connect to the Docker datemon

1、现象:

重启docker服务报错如下:

systemctl restart docker.service

Cannot connect to the Docker datemon at tcp://0.0.0.0:2375 is the docker daemon runing?

Docker部署

2、解决方案:

只能重启下网卡,然后把docker文件全部干掉,这是我当时能想到的解决方案了,自己做开发测试还好,生产千万别乱搞。(注:此方案为最终解决方案,使用此方案时,一定要参考其他方案能不能解决你的问题)

service network restart

重新开机,然后删除docker安装包(注:做如下操作时,一定要提前备份,不然你docker容器中数据会全部丢失)

rm -rf /var/lib/docker

然后重新安装下docker

sudo yum-config-manager –add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

sudo yum install docker-ce

为避免再次出现问题,我们做如下配置

配置DOCKER_HOST

sudo vim /etc/profile.d/docker.sh

添加下面内容:

export DOCKER_HOST=tcp://localhost:2375

使配置文件生效

source /etc/profile

source /etc/bashrc

配置启动文件

sudo vim /lib/systemd/system/docker.service

修改下面语句

ExecStart=/usr/bin/dockerd -H unix://

修改为:

ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654

重载配置和重启

sudo systemctl daemon-reload

sudo systemctl restart docker.service

查看

docker version

Docker部署

说明已经正常。

1、现象:

docker: Error response from daemon: OCI runtime create failed

2、解决方案:

在新服务器上安装好docker后,发现无法运行,经常一顿搜索后,发现是docker安装的版本过高,最新版本docker-18.06 的核心好像没有经过充分的测试就发布了。

导致一运行,就提示:

docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused “process_linux.go:301: running exec setns process for init caused “exit status 23″”: unknown.

查看内核版本

root@ebs-25698:~# docker-runc –version

runc version 1.0.0-rc5+dev.docker-18.06

commit: a592beb5bc4c4092b1b1bac971afed27687340c5

spec: 1.0.0

docker的版本是18.06,进行一个降级版本的操作就可以了。

docker版本降级方法

运行命令: apt-get install docker-ce=17.12.1~ce-0~ubuntu 进行降级,如果无法安装的话,先 apt-get remove docker-ce把docker卸了再装。

安装其它版本的话,自行 apt-cache policy docker-ce 查看目前可以安装的版本。

8.3 OCI runtime create failed…process_linux.go:449:

1、现象:

Docker部署

2、解决方案:

Docker部署

这是selinux未关闭所致。关闭即可。

参考文档:https://www.runoob.com/docker/centos-docker-install.html

https://www.cnblogs.com/reasonzzy/p/11378467.html

https://blog.csdn.net/zhaogot/article/details/114069916

https://www.cnblogs.com/Gdavid/p/13030007.html

https://www.cnblogs.com/seozed/p/10985003.html

https://www.cnblogs.com/xingchong/p/14810237.html

https://www.cnblogs.com/SunArmy/p/11128842.html

Original: https://www.cnblogs.com/zcj-0928/p/15117232.html
Author: 相遂
Title: Docker部署

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581778/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • shell中的段落注释

    摘自: 感叹号可以用任意的串和字符替代,比如 注意!和BLOCK之前不能有空格,但是可以用Tab Original: https://www.cnblogs.com/LiuYanY…

    Linux 2023年5月28日
    066
  • nand

    nand flash裸机编程第001节_NAND_FLASH操作原理第002节_NandFlash时序及初始化第003节_NandFlash的芯片id读取第004节_NandFla…

    Linux 2023年6月13日
    061
  • Linux系统僵尸进程详解

    大安好,我是良许。 在本文中,我们将讨论什么是僵尸进程,如何创建僵尸进程,以及如何终止僵尸进程。 [En] In this article, we will discuss wha…

    Linux 2023年5月27日
    092
  • pysimpleGui 之table使用

    (class) Table(values, headings=None, visible_column_map=None, col_widths=None, def_col_wid…

    Linux 2023年6月14日
    088
  • Debian 开机自动挂载磁盘

    首先要知道自己的磁盘是什么格式的, 常见的有 ext4 Fat32 ntfs exfat ntfs 和 exfat 磁盘格特殊说明, 因为需要额外支持才能挂载. 查看磁盘和分区的命…

    Linux 2023年6月7日
    087
  • HBuilderX配置外部服务器(tomcat)查看编辑jsp界面

    HBuilderX配置外部服务器(tomcat)查看编辑jsp界面 一、第一种方法,通过启动本地tomcat,查看jsp 在tomcat的webapps目录下创建文件夹HBuild…

    Linux 2023年6月7日
    070
  • linux inode 详解 / 线上inode爆满解决方案

    linux inode 详解 / 线上inode爆满解决方案 本文大量参考阮一峰大神博客,整理笔记 &#x4E4B;&#x6240;&#x4EE5;&amp…

    Linux 2023年6月7日
    088
  • 符号转义解决SSH远程命令执行的问题

    场景:服务器 A B C D 上存在一些日志,日志中的每行包含了日期、日志级别、日志信息等。现在要求从跳板机 X 获取这四台服务器上的数据,并通过规则(如日期)筛选,汇总到一个文件…

    Linux 2023年6月14日
    073
  • 阿里云函数-小米运动

    简介 是否支持多账号:是消息推送平台: server酱 Qmsg酱 PUSHPLUS 原代码(2022.07.12更新)- 不稳定 由于官方接口偶偶失效(每两三月可能失效1-2天(…

    Linux 2023年6月7日
    078
  • 设计模式——命令模式

    命令模式定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和回复的功能。 Receive接收者角色 该角色就是干活…

    Linux 2023年6月7日
    092
  • 快速掌握Linux三剑客命令使用

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    087
  • 干货!Zabbix+ES怎么玩?如何应对海量级监控数据?一文带你玩转开源解决方案。

    写在开篇 不管zabbix的后端数据库是oracle还是mysql,当zabbix监控的量级达到了一定程度后,那么对数据库的性能是一个非常严峻的挑战。特别是对历史数据的查询,将会变…

    Linux 2023年6月7日
    0126
  • Tomcat 介绍及使用教程

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 1. Tomcat 介绍 Apache Tomcat 是由 Apache Software Foundation(ASF)开发的…

    Linux 2023年5月27日
    064
  • JS实现整个DIV里的字号整体放大或缩小

    JS实现对DIV里内容的字体方法或缩小 html代码 只写主要代码,样式可以自己写 <div class="content_sms"> &#x8FD…

    Linux 2023年6月7日
    076
  • jmeter 安装与环境变量配置

    安装jmeter首先要安装与jmeter版本兼容的JDK,安装完成JDK后才能安装jmeter,JDK可以自行在官网下载或者通过360软件管家进行下载。 1、下载安装JDK 安装完…

    Linux 2023年6月8日
    080
  • 【Docker搭建】3. 在Docker中搭建Zookeeper集群

    docker pull zookeeper docker run –name zk1 -d zookeeper apt-get update apt-get install vi…

    Linux 2023年6月13日
    081
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球