docker安装及常用功能简介

一、Docker安装与启动

1、安装

(1)yum 包更新到最新

sudo yum update

(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

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

(3)设置yum源为阿里云

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

​ 如果是新的系统,可能会出现命令不可用的情况,这时候需要先安装yum-utils

yum -y install yum-utils 

(4)安装docker

sudo yum install docker-ce

(5)安装后查看docker版本

docker -v

2、设置ustc的镜像和日志分割

创建并编辑文件

vi /etc/docker/daemon.json  

在该文件中输入如下内容:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}

“max-size”: "10m"的意思是每个文件最大10m;“max-file”: "3"的意思是最多只有三个文件,如果超过之前的会被顶掉。每次修改完该文件后,需要重启docker和所有的容器。其中日志相关部分只对新建的容器有效,原有的容器需要删除重新创建

3、Docker的启动与停止

(1)启动docker:

systemctl start docker

(2)停止docker:

systemctl stop docker

(3)重启docker:

systemctl restart docker

(4)查看docker状态:

systemctl status docker

(5)开机启动:

systemctl enable docker

(6)查看docker概要信息

docker info

(7)查看docker帮助文档

docker --help

二、常用命令

1、镜像相关命令

(1)查看镜像

docker images

REPOSITORY:镜像名称

TAG:镜像标签

IMAGE ID:镜像ID

CREATED:镜像的创建日期(不是获取该镜像的日期)

SIZE:镜像大小

这些镜像都是存储在Docker宿主机的/var/lib/docker目录下

(2)搜索镜像
如果你需要从网络中查找需要的镜像,可以通过以下命令搜索

docker search 镜像名称

NAME:仓库名称

DESCRIPTION:镜像描述

STARS:用户评价,反应一个镜像的受欢迎程度

OFFICIAL:是否官方

AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

(3)拉取镜像
拉取镜像就是从中央仓库中下载镜像到本地

docker pull 镜像名称/镜像ID


docker pull centos:7    #​ “:”后面是版本号,如果不写的话,直接下载最新的。

(4)删除镜像

docker rmi 镜像ID

2、容器相关命令

(1)查看容器
查看正在运行的容器

docker ps

查看所有容器

docker ps –a

查看停止的容器

docker ps -f status=exited

(2)创建与启动容器
创建容器常用的参数说明:

创建容器命令:docker run

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

–name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

1)交互式方式创建容器:

docker run -it --name=容器名称 镜像名称:标签 bash

2)守护式方式创建容器:

docker run -di --name=容器名称 镜像名称:标签

进入守护式容器方式:

docker exec -it 容器名称 (或者容器ID) bash

退出当前容器

exit

(3)停止与启动容器
停止容器:

docker stop 容器名称(或者容器ID)

启动容器:

docker start 容器名称(或者容器ID)

(4)文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令

docker cp 需要拷贝的文件或目录 容器名称:容器目录

也可以将文件从容器内拷贝出来

docker cp 容器名称:容器目录 需要拷贝的文件或目录

(5)目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。
创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7

挂载后,修改完宿主机文件,直接重新启动容器便可。

如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

(6)查看运行容器的各种数据

docker inspect 容器名称(容器ID) 

(7)删除容器
注意如果是运行的容器直接进行删除或出现错误提示,只有先关闭后才可以移除。

docker rm 容器名称(容器ID)

(8)查看容器日志

docker logs -f 容器ID

也可以进入/var/lib/docker/containers文件夹下查看

三、镜像、容器迁移

1、镜像迁移

(1)在一台服务器上打包镜像,打包后文件的位置就在当前目录下

docker save pgrouting/pgrouting:12-3.0-3.0.1(镜像名称) > pgrouting.tar(打包的名称)

(2)在另一台服务器解压镜像

docker load -i pgrouting.tar

这时docker images就会看到打包之前的镜像了,适合离线模式下复制镜像

2、容器迁移

(1)将容器变成镜像

docker commit pgrouting pgimage

(2)打包镜像

docker save -o pgimage.tar pgimage

(3)在另一台服务器解压镜像

docker load -i pgimage.tar

(4)正常运行镜像生成容器便可

docker run --name pgrouting -e POSTGRES_PASSWORD=postgres -v /usr/local/pgrouting:/var/lib/postgresql -p 15432:5432 -d pgimage

四、通过Dockerfile封装镜像

1、将jdk打包为镜像

(1)拉取centos7镜像

docker pull centos:7

(2)下载linux版本jdk
我用的是jdk-8u261-linux-x64.tar.gz

(3)创建Dockerfile

#依赖镜像名称和ID
FROM centos:7
#指定镜像创建者信息
MAINTAINER ITCAST
#切换工作目录
WORKDIR /usr
RUN mkdir  /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u261-linux-x64.tar.gz /usr/local/java/

#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_261
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

(4)将Dockerfile和jdk放在同一个目录下,封装镜像

docker build -t jdk:8 .

注意后边的空格和点,不要省略。这个点表示当前文件夹下去寻找Dockerfile文件。如果不在当前文件夹下,可指定路径。

2、将jar包打包为镜像

(1)创建Dockerfile

FROM jdk1.8:latest
EXPOSE 8085
VOLUME /data
ADD GBS-TD-api.jar GBS-TD-api.jar
ENTRYPOINT ["java","-jar","GBS-TD-api.jar"]

(2)将Dockerfile和jar包放在同一个目录下,封装镜像

docker build -t gbs .

(3)运行镜像

docker run --name gbs-api -p 8085:8085 -d gbs

(4)进入容器

docker exec -it gbs-api bash

五、安装常用软件

1、安装postgresql+postgis+pgrouting

(1)拉取镜像

docker pull pgrouting/pgrouting:12-3.0-3.0.1

(2)运行镜像生成容器

docker run --name pgrouting -e POSTGRES_PASSWORD=postgres -v /usr/local/pgrouting:/var/lib/postgresql -p 15432:5432 -d pgrouting/pgrouting:12-3.0-3.0.1

(3)进入容器

docker exec -it pgrouting bash

(4)进入数据库

psql -U postgres

(5)安装插件

CREATE EXTENSION PostGIS
CREATE EXTENSION pgRouting

(6)退出数据库

\q

(7)退出容器

exit

2、安装nginx

(1)拉去镜像

docker pull nginx

(2)运行镜像生成容器

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

(3)进入容器

docker exec -it nginx bash

(4)创建挂载目录

mkdir -p /data/nginx/conf #存放配置文件
mkdir -p /data/nginx/logs
mkdir -p /data/nginx/conf.d

(5)复制配置文件

docker cp nginx:/etc/nginx/nginx.conf /data/nginx/conf/
docker cp nginx:/etc/nginx/conf.d/default.conf  /data/nginx/conf.d
docker cp nginx:/var/log/nginx  /data/nginx/logs
docker cp nginx:/usr/share/nginx/html  /data/nginx/        #前端页面放在宿主机的/data/nginx/html目录下,配置文件中的地址写的是容器中地址/usr/share/nginx/html。

(6)停止原有容器并删除

docker stop nginx
docker rm nginx

(7)修改配置文件nginx.conf
代理后端和正常一样
代理前端页面:前端页面放在宿主机的/data/nginx/html目录下,配置文件中的地址写的是容器中地址/usr/share/nginx/html。

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

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

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
	
	
	upstream nacoscluster {
        server 192.168.3.21:8848;
        server 192.168.3.22:8848;
        server 192.168.3.23:8848; 
	}

	server {
		listen        80;
		server_name   192.168.3.22;

		location /nacos/ {
			proxy_pass http://nacoscluster/nacos/;
		}
		
		location ^~/tiles{ 
            alias   /usr/share/nginx/html/tiles;     #容器内目录
            autoindex on;
			charset utf-8,utf-8;
        }

		location /truck-dispatch {
            alias   /usr/share/nginx/html/dist;       #容器内目录
            try_files $uri $uri/ /index.html;  # 解决刷新报404的问题
            index  index.html index.htm;
        }
	}
}

(8)启动容器并完成文件挂载

docker run --name nginx --privileged -it -p 8081:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/conf.d:/etc/nginx/conf.d -v /data/nginx/html:/usr/share/nginx/html  -v/data/nginx/logs:/var/log/nginx -d nginx

3、安装rabbitmq

(1)拉取

docker pull rabbitmq:3.9.20-management-alpine

(2)运行

docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq -v /data/rabbitmq/:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root rabbitmq:3.9.20-management-alpine

4、安装reids

(1)拉取

docker pull redis:6.2.5

(2)创建挂载目录

mkdir -p /data/redis/{conf,data}

(3)在 /data/redis/conf下创建redis.conf

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~redis 配置~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 指定Redis 只接收来自于该IP 地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中为了安全最好设置该项。默认注释掉,不开启
#bind 127.0.0.1
 
# #默认yes,开启保护模式,限制为本地访问
protected-mode no
# 监听端口,默认为6379
port 6379
 
# 链接密码
requirepass 123456
 
tcp-backlog 511
 
# 设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
timeout 0
 
# 指定TCP连接是否为长连接,"侦探"信号有server端维护。默认为0.表示禁用
tcp-keepalive 300
 
# 默认情况下,redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。
daemonize no
 
supervised no
 
# 当Redis 在后台运行的时候,Redis 默认会把pid 文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis 服务时,需要指定不同的pid 文件和端口
pidfile /var/run/redis_6379.pid
 
# log 等级分为4 级,debug,verbose, notice, 和warning。生产环境下一般开启notice
loglevel notice
 
# 配置log 文件地址,默认使用标准输出,即打印在命令行终端的窗口上,修改为日志文件目录
logfile ""
 
# 设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0号库。默认16个库
databases 16
 
always-show-logo yes
 
# 保存数据快照的频率,即将数据持久化到dump.rdb文件中的频度。用来描述"在多少秒期间至少多少个变更操作"触发snapshot数据保存动作
#默认设置,意思是:
# if(在60 秒之内有10000 个keys 发生变化时){
# 进行镜像备份
# }else if(在300 秒之内有10 个keys 发生了变化){
# 进行镜像备份
# }else if(在900 秒之内有1 个keys 发生了变化){
# 进行镜像备份
# }
save 900 1
save 300 10
save 60 10000
 
# 当持久化出现错误时,是否依然继续进行工作,是否终止所有的客户端write请求。默认设置"yes"表示终止,一旦snapshot数据保存故障,那么此server为只读服务。如果为"no",那么此次snapshot将失败,但下一次snapshot不会受到影响,不过如果出现故障,数据只能恢复到"最近一个成功点"、
stop-writes-on-bgsave-error yes
 
# 在进行数据镜像备份时,是否启用rdb文件压缩手段,默认为yes。压缩可能需要额外的cpu开支,不过这能够有效的减小rdb文件的大,有利于存储/备份/传输/数据恢复 读取和写入时候,会损失10%性能
rdbcompression yes
 
# 是否进行校验和,是否对rdb文件使用CRC64校验和,默认为"yes",那么每个rdb文件内容的末尾都会追加CRC校验和,利于第三方校验工具检测文件完整性
rdbchecksum yes
 
# 镜像备份文件的文件名,默认为 dump.rdb
dbfilename dump.rdb
 
rdb-del-sync-files no
 
# 数据库镜像备份的文件rdb/AOF文件放置的路径。这里的路径跟文件名要分开配置是因为Redis 在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中
dir ./
 
replica-serve-stale-data yes
 
replica-read-only yes
 
repl-diskless-sync no
 
repl-diskless-sync-delay 5
 
repl-diskless-load disabled
 
repl-disable-tcp-nodelay no
 
replica-priority 100
 
acllog-max-len 128
 
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
 
lazyfree-lazy-user-del no
 
# 默认情况下,redis 会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁。所以redis 提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only 模式之后,redis 会把所接收到的每一次写操作请求都追加到appendonly.aof 文件中,当redis 重新启动时,会从该文件恢复出之前的状态。但是这样会造成appendonly.aof 文件过大,所以redis 还支持了BGREWRITEAOF 指令,对appendonly.aof 进行重新整理。如果不经常进行数据迁移操作,推荐生产环境下的做法为关闭镜像,开启appendonly.aof,同时可以选择在访问较少的时间每天对appendonly.aof 进行重写一次。
appendonly no
 
 
appendfilename "appendonly.aof"
 
# 设置对appendonly.aof 文件进行同步的频率。always 表示每次有写操作都进行同步,everysec 表示对写操作进行累积,每秒同步一次。no不主动fsync,由OS自己来完成。这个需要根据实际业务场景进行配置
appendfsync everysec
 
no-appendfsync-on-rewrite no
 
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
 
aof-load-truncated yes
 
aof-use-rdb-preamble yes
 
lua-time-limit 5000
 
slowlog-log-slower-than 10000
 
slowlog-max-len 128
 
latency-monitor-threshold 0
 
notify-keyspace-events ""
 
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
 
list-max-ziplist-size -2
 
list-compress-depth 0
 
set-max-intset-entries 512
 
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
 
hll-sparse-max-bytes 3000
 
stream-node-max-bytes 4096
stream-node-max-entries 100
 
# 是否开启顶层数据结构的rehash功能,如果内存允许,请开启。rehash能够很大程度上提高K-V存取的效率
activerehashing yes
 
# 客户端buffer控制。在客户端与server进行的交互中,每个连接都会与一个buffer关联,此buffer用来队列化等待被client接受的响应信息。如果client不能及时的消费响应信息,那么buffer将会被不断积压而给server带来内存压力.如果buffer中积压的数据达到阀值,将会导致连接被关闭,buffer被移除。
 
#buffer控制类型包括:normal -> 普通连接;slave ->与slave之间的连接;pubsub ->pub/sub类型连接,此类型的连接,往往会产生此种问题;因为pub端会密集的发布消息,但是sub端可能消费不足.
#指令格式:client-output-buffer-limit    ",其中hard表示buffer最大值,一旦达到阀值将立即关闭连接;
#soft表示"容忍值",它和seconds配合,如果buffer值超过soft且持续时间达到了seconds,也将立即关闭连接,如果超过了soft但是在seconds之后,buffer数据小于了soft,连接将会被保留.
#其中hard和soft都设置为0,则表示禁用buffer控制.通常hard值大于soft.
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
 
# Redis server执行后台任务的频率,默认为10,此值越大表示redis对"间歇性task"的执行次数越频繁(次数/秒)。"间歇性task"包括"过期集合"检测、关闭"空闲超时"的连接等,此值必须大于0且小于500。此值过小就意味着更多的cpu周期消耗,后台task被轮询的次数更频繁。此值过大意味着"内存敏感"性较差。建议采用默认值。
hz 10
 
dynamic-hz yes
 
aof-rewrite-incremental-fsync yes
 
rdb-save-incremental-fsync yes
 
jemalloc-bg-thread yes

(4)运行

docker run -p 6379:6379 -v /data/redis/data:/data -v /data/redis/conf/redis.conf:/etc/redis/redis.conf --privileged=true --name myRedis -d redis:6.2.5 redis-server /etc/redis/redis.conf

六、搭建私有仓库

(1)拉取仓库镜像

docker pull registry

(2)启动私有仓库容器

docker run -di --name=registry -p 5000:5000 registry

(3)修改/etc/docker/daemon.json
在大括号里添加:“insecure-registries”:[“192.168.3.22:5000”]

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "http://hub-mirror.c.163.com"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker",
  "insecure-registries": ["192.168.3.22:5000"]
}

(4)重启docker

systemctl restart docker

(5)重启仓库容器

docker start registry

(6)查看浏览器

http://192.168.3.22:5000/v2/_catalog

(7)标记此镜像为私有仓库的镜像

docker tag redis:6.2.5 192.168.3.22:5000/redis

(8)上传,此时查看浏览器会看到有镜像加入

docker push 192.168.3.22:5000/redis

(9)拉取

docker pull 192.168.3.22:5000/redis

你可能感兴趣的:(docker,docker,运维,容器)