Docker安装部署

安装

windows

要求win10专业版或者企业版

win下载地址

Linux

curl -sSL https://get.docker.com/ | sh

docker info

docker version

win VBox NAT连接虚拟机

使用设备->网络->NAT->端口转发,添加端口映射规则

Portainer -- Docker可视化管理工具

# 查询当前有哪些Portainer镜像
docker search portainer

# 下载镜像
docker pull portainer/portainer

docker国内源

# Docker中国区官方镜像
https://registry.docker-cn.com
# 网易
http://hub-mirror.c.163.com
# 中国科技大学
https://docker.mirrors.ustc.edu.cn
# 阿里云容器  服务
https://cr.console.aliyun.com/

"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]

阿里云镜像源

# 脚本安装
    curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xcqonmnq.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

Error response from daemon: pull access denied for porportainer/portainer, repository does not exist or may require 'docker login'

需要登录使用

使用docker login登录

Docker-Compose安装

安装方法一:

sudo curl -L https://github.com/docker/compose/releases/download/1.23.0-rc3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

安装Docker-Compose:

sudo chmod +x /usr/local/bin/docker-compose

查看版本 :

docker-compose version

安装方法二:

yum -y install epel-release
yum -y install python-pip

# 安装docker-compose
pip install docker-compose

安装补全工具:
为了方便输入命令,也可以安装Docker的补全提示工具帮忙快速输入命令:
安装

yum install bash-completion

获取远程的docker仓库标签tag

vim dockertags.sh
#!/bin/bash

function usage() {
    cat << HELP

dockertags  --  list all tags for a Docker image on a remote registry.

EXAMPLE:
    - list all tags for ubuntu:
       dockertags ubuntu

    - list all php tags containing apache:
       dockertags php apache

HELP
}

if [ $# -lt 1 ]; then
    usage
    exit
fi

image="$1"
tags=`wget -q https://registry.hub.docker.com/v1/repositories/$image}/tags -O -   ( sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr ') ' '\n'  | awk -F: '{print $3}'`

if [ -n "$2" ]
then
    tags=` echo "${tags}" | grep "$2" `
fi

echo "${tags}"

运行

chmod +x ~/bin/dockertags.sh
./dockertags.sh centos

下载docker-compose脚本

curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Docker-Compose卸载
如果是二进制包方式安装的,删除二进制文件即可:

sudo rm /usr/local/bin/docker-compose

如果通过Python pip工具安装的,则执行如下命令删除:

sudo pip uninstall docker-compose

Docker-Compose常用命令及参数

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

    -f –file FILE指定Compose模板文件,默认为docker-compose.yml,可以多次指定。
    -p –project-name NAME指定项目名称,默认将使用所在目录名称作为项目名。
    -x-network-driver 使用Docker的可拔插网络后端特性(需要Docker 1.9+版本)
    -x-network-driver DRIVER指定网络后端的驱动,默认为bridge(需要Docker 1.9+版本)
    -verbose 输出更多调试信息
    -v –version打印版本并退出

docker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]

    -d 在后台运行服务容器
    –no-color 不使用颜色来区分不同的服务的控制输出
    –no-deps 不启动服务所链接的容器
    –force-recreate 强制重新创建容器,不能与–no-recreate同时使用
    –no-recreate 如果容器已经存在,则不重新创建,不能与–force-recreate同时使用
    –no-build 不自动构建缺失的服务镜像
    –build 在启动容器前构建服务镜像
    –abort-on-container-exit 停止所有容器,如果任何一个容器被停止,不能与-d同时使用
    -t –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
    –remove-orphans 删除服务中没有在compose文件中定义的容器
    –scale SERVICE=NUM 设置服务运行容器的个数,将覆盖在compose中通过scale指定的参数
    
# 启动所有服务
docker-compose up

# 在后台所有启动服务
docker-compose up -d

# -f 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
docker-compose -f docker-compose.yml up -d

# 列出项目中目前的所有容器
docker-compose ps

# 停止正在运行的容器,可以通过docker-compose start 再次启动
# -t, –timeout TIMEOUT 停止容器时候的超时(默认为10秒)
docker-compose stop

# 停止和删除容器、网络、卷、镜像。
docker-compose down [options]
    –rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
    -v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
    –remove-orphans,删除服务中没有在compose中定义的容器

# 停用移除所有容器以及网络相关
docker-compose down

# 查看服务容器的输出
# –no-color来关闭颜色。
docker-compose logs

# 构建(重新构建)项目中的服务容器。
docker-compose build [options] [--build-arg key=val...] [SERVICE...]

    –compress 通过gzip压缩构建上下环境
    –force-rm 删除构建过程中的临时容器
    –no-cache 构建镜像过程中不使用缓存
    –pull 始终尝试通过拉取操作来获取更新版本的镜像
    -m, –memory MEM为构建的容器设置内存大小
    –build-arg key=val为服务设置build-time变量
    
    服务容器一旦构建后,将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务

容器与主机共享数据

# 从容器内拷贝文件到主机上
docker cp <containerId>:/file/path/within/container /host/path/target

# 从主机上拷贝文件到容器内
docker run -v /path/to/hostdir:/mnt $container

# 在容器内拷贝
cp /mnt/sourcefile /path/to/destfile


# 将主机/www/boy目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/boy 96f7f14e99ab:/www/

# 将主机/www/boy目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/boy 96f7f14e99ab:/www

# 将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp  96f7f14e99ab:/www /tmp/

报错image has dependent child images

# xxx指镜像ID
docker image inspect --format='{{.RepoTags}} {{.Id}} {{.Parent}}' $(docker image ls -q --filter since=xxx)    

启动一个交互式的容器shell

# mymysql 为container名称
docker exec -it mymysql bash

直接在主机上拷贝到容器物理存储系统

# A. 获取容器名称或者id :
$ docker ps -a

# B. 获取整个容器的id
$ docker inspect 498408108f84 -f '{{.Id}}'  步骤A获取的名称或者id

# C. 在主机上拷贝文件:
$ sudo cp path-file-host /var/lib/docker/aufs/mnt/FULL_CONTAINER_ID/PATH-NEW-FILE 
# 或者
$ sudo cp path-file-host /var/lib/docker/devicemapper/mnt/123abc<<id>>/rootfs/root

单机版运行

docker volume create portainer_data

docker run -d -p 9001:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

该语句用宿主机9000端口关联容器中的9000端口,并给容器起名为portainer-test。执行完该命令之后,使用该机器IP:PORT即可访问Portainer。

访问方式:http://IP:9000

端口被占用时,重复执行出现 The container name "/prtainer-test" is already in use by container d6f2eb547341e

"Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/json: dial unix /var/run/docker.sock: connect: permission denied"

docker进程使用Unix Socket而不是TCP端口。而默认情况下,Unix socket属于root用户,需要root权限才能访问。

sudo groupadd docker     #添加docker用户组
sudo gpasswd -a $USER docker     #将登陆用户加入到docker用户组中
newgrp docker     #更新用户组
docker ps    #测试docker命令是否可以使用sudo正常使用
docker ps -a

docker rm name_of_the_docker_container

Jenkins运行

docker run -d -p 8800:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins -v /etc/localtime:/etc/localtime --name jenkins docker.io/jenkins/jenkins

MySQL 运行

# 下载mysql
docker pull mysql:5.6

# 创建mysql持久化挂载目录
mkdir mysql-docker
cd mysql-docker

docker run -p 3307:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.6

更改容器端口映射

#先停止容器
docker stop containerA
#将容器commit成为一个镜像
docker commit containerA  newImageB
#运行容器
docker run  -p 8080:8080 -p 8081:8081 -v /home/data/:/home/data/ -dt newImageB

打包docker镜像

export&import 和 save & load 的区别

类型 | 作用 | 作用对象 | 能否保留存储层数据 | 导出的内容 | 主要的应用场景
---|---|---|---|---|---|---
export & import | 用来将container的文件系统进行打包的 | container | 不可以 | 一个Linux系统的文件目录 | 制作基础镜像
save & load | 用来将一个或者多个image打包 | image(container实际上也可以,但其实际上作用的是container下的image) | 可以 | 一个分层的文件系统(相对于前者比较大,因为多层文件系统中可能有东西是重合的) | 打包多个镜像

  1. docker save保存的是镜像(image),docker export保存的是容器(container);
  2. docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
  3. docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。

save & load

# mymysql为container名称 mysql5.6:v0 为image名称并加上tag版本信息
docker commit --author allen --message "save mysql data images" mymysql mysql5.6:v0

# mysql5.6 为本地文件名称, mysql5.6:v0为image名称和版本信息
docker save -o mysql5.6 mysql5.6:v0

#导入镜像
docker load -i mysql5.6

# 运行镜像 --name为容器名, -h 为主机名, --add-host向hosts文件添加其他主机的ip信息, --mount 将容器中的某个目录和宿主机的某个目录绑定,为了实现持久化,若不需要可忽略, mysql5.6:v0 为使用的镜像
docker run --privileged -d -P --name mymysql -h slave02 --add-host master:172.17.0.2 --add-host slave01:172.17.0.3 --mount type=bind,source=/data/local/slave02,target=/usr/local/data mysql5.6:v0 

export & import

# mysql5.6-exp为输出文件名,mymysql为 container 名称
docker export -o mysql5.6-exp.tar mymysql

# mysql5.6:v0为 image 名称
docker import mysql5.6-exp.tar mysql5.6:v0

# 运行import的镜像(必须指定Command)
docker run -p 3307:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql5.6:v1 docker-entrypoint.sh mysqld

# 查看Command
docker ps -a

docker import将container导入后会成为一个image,而不是恢复为一个container。

显示完整的输出,不会截断

docker ps --no-trunc

复制mysql数据库文件(ibdata1平时必须拷贝,否则数据不全),到docker中文件所属组问题

1018 - Can't read dir of './rest/' (errno: 13 - Permission denied)

drwx------ 2 systemd-bus-proxy input     4096 Aug 12 14:40 performance_schema
drwx------ 2 root              root     24576 Aug 12 15:53 rest

改变下所属组

sudo chown -R systemd-bus-proxy:input rest/

Zookeeper 运行

# 创建 zookeeper 持久化挂载目录
mkdir zookeeper-docker
cd zookeeper-docker

# --privileged 使容器具有 root 的执行权限
docker run -p 2182:2181 -v zookeeper-docker/zookeeper/data/:/data/ --name=zookeeper  --privileged -d zookeeper

Kafka 运行

# 下载 kafka 镜像 
docker pull wurstmeister/kafka

# 创建 kafka 持久化挂载目录
mkdir kafka-docker
cd kafka-docker

# 运行 Kafka ,--link 连接两个容器,可以互相通信
docker run --name kafka --publish 9093:9093 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2182 --env KAFKA_ADVERTISED_HOST_NAME=192.168.1.66 --env KAFKA_ADVERTISED_PORT=9093 --env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.66:9093 --env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 --volume $PWD/etc/localtime:/etc/localtime -d wurstmeister/kafka:latest

注:由于docker kafka版本不断迭代,KAFKA_ADVERTISED_HOST_NAME 不再建议是用localhost/127.0.0.1,故需要使用KAFKA_ADVERTISED_HOST_NAME= ip地址

kali 运行

docker run --name kali -it -p 100:22 kalilinux/kali-linux-docker /bin/bash

巡风系统运行

docker run -d -p 8000:80 -v /opt/data:/data ysrc/xunfeng:latest

nessus docker

docker run -d -p 8834:8834  e714228e7aac
    
# 使用https启动
https://127.0.0.1:8834

# 使用交互式shell运行
docker  run -i -t name

# 执行命令,查看所有运行id
docker ps -a

# 进入容器
docker exec -it e9409ab95abf bash

# nessus_scanner docker
docker run -dt -p 8834:8834 -e LICENSE=6CE8-9469-13F9-AE35-8DC7 -e SCANNER_NAME=nessus -e ADMIN_USER=admin -e ADMIN_PASS=321 --name nessus_scanner stevemcgrath/nessus_scanner

# nessus 离线plugins

Your activation code for Nessus Essentials is:
6CE8-9469-13F9-AE35-8DC7

./nessuscli fetch --register-offline nessus.license

Thank you. You can now obtain the newest Nessus plugins at :

https://plugins.nessus.org/v2/nessus.php?f=all-2.0.tar.gz&u=3cd39bcf47ce38c244a7a7bf77fa8c7e&p=bb6bb3559564f978e46cfb825d4cb523

/opt/nessus/sbin/nessuscli update /root/all-2.0.tar.gz

You can copy the following license and paste it into the Nessus console to proceed:
-----BEGIN TENABLE LICENSE-----
am9lTWc4dnVkNjB5Z1djVGlrZjdvYmszOEZ0bitBTEZWMmY3RWltRGJHMU1pYk4zbWFJV09OajFq
QndCUWFjSm1KMmJYeVhzTW1wZmxia1hwbmxXVTFtMkgvSlRtU0ZDbmVmUkl2WHo0MWwwdjZLQnRm
ZVdwUnJOd3RmaXpQSEVjVFIybGk3ZFlVTHZuaUQ2dHhtVWkwSis1RnBYeWwyRW1zRWhXOFptay9J
ZHBpWTlDdjNORHNWTzUxTEV3cTZwc29COVplTDBtZ0M5MUNXQTVReGd2bGJsdWFHTVFpZVdKVzdn
WkhBMHpaNXNDK3Z6NEJsTURkTDlRM3U2S05USHQ5UzFXSHBQdkhXakpOZitxMkE2cTVQU3Z1TmJS
MDJvLzRvVk5wMnFCSVp2TnZPOWRsV3JxNWhLWjJuNXkzVzhydWVBVWFFa2w2Q0VKQksvc0pCamlK
aUp0blRPam1YVW84N0hEQTEvVHREMVBKS1RvYWFSaWNqVzN3ODdqZFA4TmdZK0xlckVIR0NRdDlv
dTJUWVl5bXZCOXpCbFJibXZrNWdDMEZhNjNkSmVtM09ISXV1WXdTOVIxd3RaSXVMSzAzU3VXV2RB
RjBLYkV5ZHVOaTNzUS9EZjViRm9hcW1GSUsrOEJVVXhJcFFvUVhuaWtQUVNzODQvWklsa3V4b1ZD
cy9DVC9IYlQ1SEVhQlA4Z3RmTGN6RGlMSTNoaGx0WE03VmRkTENjUC9nWFhCODAySFRlc1JrYkFX
b3RhNXgyeHc0QXlIQUVUbVBiMjBpRGt0RkE4bWZrMjk3M0ZvUVZxTVdJak1MRitHcmpRcmJoUm00
K3IvQ1NscGhjNWdmbW1lZzlSclltN3I2Q0pRSzZZTW9DcnhqRnJyTHZsemdJVzZhN0d5Z0FyU2M9
DQp7ImFjdGl2YXRpb25fY29kZSI6IjZDRTgtOTQ2OS0xM0Y5LUFFMzUtOERDNyIsInVwZGF0ZV9w
YXNzd29yZCI6ImJiNmJiMzU1OTU2NGY5NzhlNDZjZmI4MjVkNGNiNTIzIiwibmFtZSI6Ik5lc3N1
cyBIb21lIiwidHlwZSI6ImhvbWUiLCJleHBpcmF0aW9uX2RhdGUiOjE3NTMxNjUxODAsImlwcyI6
MTYsInVwZGF0ZV9sb2dpbiI6IjNjZDM5YmNmNDdjZTM4YzI0NGE3YTdiZjc3ZmE4YzdlIiwiZHJt
IjoiZDM0MTk2NWUzMTNhOTU1NWYyYmQ5MzZiN2Q5MDBjZWYifQ==
-----END TENABLE LICENSE-----


OR

You may also install the license using Nessus command line tools:
/opt/nessus/sbin/nessuscli fetch --register-offline nessus.license(Linux/Unix)
C:\\Program Files\\Tenable\\Nessus\\nessuscli.exe fetch --register-offline nessus.license (Windows Vista/7/8/2008/2012)
/Library/Nessus/run/sbin/nessuscli fetch --register-offline nessus.license (Mac OS X)
/usr/local/nessus/sbin/nessuscli fetch --register-offline nessus.license (FreeBSD)


# nessus.license   
https://plugins.nessus.org/v2/mkconfig.php?ac=3cd39bcf47ce38c244a7a7bf77fa8c7ebb6bb3559564f978e46cfb825d4cb523d341965e313a9555f2bd936b7d900cef

其中,-d 表示在后台运行,-p 表示 把本机的8834端口转发到容器的8834端口,如果需要,可用多个-p参数指定多个端口转发。
上述的-p是小写的p,如果使用大写的P则不需要指定端口

最后由 不一样的少年 编辑于2020年12月03日 17:27