Docker使用手册

docker简介 #官方网站 官方网站:https://www.docker.com/ 官方文档:https://docs.docker.com/ 官方仓库:https://hub.docker.com/ #主要作用 将资源、用户、网络&

docker简介


#官方网站

官方网站:https://www.docker.com/

官方文档:https://docs.docker.com/

官方仓库:https://hub.docker.com/

  

#主要作用

将资源、用户、网络、进程和宿主机进行隔离(类似于沙盒)

  

#安装要求

要安装docker-ce(社区版)操作系统的最低要求是CentOS7(7以下版本都不被支持)

安装docker

  • CentOS系统

#Step1优化软件源

curl  -L  https://drive.yangwn.top/d/AliDrive/Shell/system.sh | sh  #通过脚本优化YUM源使用的为阿里云YUM仓库

wget  -O  /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #docker-ce.repo

yum  clean  all && yum  makecache  #建立YUM源缓存

  

#Step2安装必要的一些系统工具

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

  

#Step3安装Docker-CE

yum  -y  install  docker-ce

  

#Step5开启Docker服务

systemctl  daemon-reload && systemctl  enable  --now  docker

  

#Step6安装校验

docker  version

docker  info

  

# 官方软件源默认启用了最新的软件

# vim /etc/yum.repos.d/docker-ce.repo

# 将[docker-ce-test]下方的enabled=0修改为enabled=1

#

# 查找Docker-CE的版本

# yum list docker-ce.x86_64 --showduplicates | sort -r

# Loading mirror speeds from cached hostfile

# Loaded plugins: branch, fastestmirror, langpacks

# docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable

# docker-ce.x86_64 17.03.1.ce-1.el7.centos @docker-ce-stable

# docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable

# 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)

# yum -y install docker-ce-[VERSION]

# 通过官方脚本安装(尝鲜版本)

# wget -qO https://get.docker.com/ | sh

  • Ubuntu系统

#step1安装必要的一些系统工具

sudo  apt-get  update

sudo  apt-get  -y  install  apt-transport-https  ca-certificates  curl  software-properties-common

  

#step2安装GPG证书

curl  -fsSL  https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo  apt-key  add  -

  

#Step3写入软件源信息

sudo  add-apt-repository  "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release  -cs) stable"

  

#Step4新并安装Docker-CE

sudo  apt-get  -y  update

sudo  apt-get  -y  install  docker-ce

  

#Step5安装校验

docker  version

docker  info

  

# 安装指定版本的Docker-CE:

# Step 1: 查找Docker-CE的版本:

# apt-cache madison docker-ce

# docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages

# docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages

# Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)

# sudo apt-get -y install docker-ce=[VERSION]

  • Windows系统

#linux端安装docker不用开虚拟化

#win端安装docker需要开启虚拟化选项

安装docker-compose

  • Linux系统

#下载二进制文件

curl  -L  https://get.daocloud.io/docker/compose/releases/download/v2.2.2/docker-compose-`uname  -s`-`uname  -m` > /usr/local/bin/docker-compose

  

#赋予执行全新

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

  

#安装校验

docker-compose  -v

  • Windows系统

https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-windows-x86_64.exe

配置镜像加速


#不用注册的镜像加速

http://hub-mirror.c.163.com/  #163

https://ustc-edu-cn.mirror.aliyuncs.com/  #中国科学技术大学

https://registry.docker-cn.com  #官方的中国镜像加速器

  

#修改守护进程daemon的配置文件(注意以逗号相关)

cat << EOF | tee /etc/docker/daemon.json

{

"graph": "/data/docker",

"storage-driver": "overlay2",

"exec-opts": ["native.cgroupdriver=systemd"],

"bip": "172.17.0.1/24",

"exec-opts": ["native.cgroupdriver=systemd"],

"insecure-registries": ["192.168.1.7","registry.access.redhat.com","quay.io"],

"registry-mirrors": ["http://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"],

"live-restore": true

}

EOF

  

#重启服务

systemctl  daemon-reload && systemctl  restart  docker

  

#daemon.json配置介绍

"graph"  #该关键字未来将被弃用(可以采用 "data-root" 替代)

"storage-driver"  #存储驱动(即分层文件系统)

"exec-opts"  #指定Cgroup的驱动为systemd

"bip"  #指定docker0网卡地址地址(相当于设置默认bridge网段)

"registry-mirrors"  #配置镜像加速

"insecure-registries"  #使用私有云镜像仓库

"live-restore"  #实现容器不会因为重启docker服务而退出

docker镜像管理


Usage:  docker  image  COMMAND

Manage  images

Commands:

build  Build  an  image  from  a  Dockerfile

history  Show  the  history  of  an  image

import  Import  the  contents  from  a  tarball  to  create  a  filesystem  image

inspect  Display  detailed  information  on  one  or  more  images

load  Load  an  image  from  a  tar  archive  or  STDIN

ls  List  images

prune  Remove  unused  images

pull  Pull  an  image  or  a  repository  from  a  registry

push  Push  an  image  or  a  repository  to  a  registry

rm  Remove  one  or  more  images

save  Save  one  or  more  images  to  a  tar  archive (streamed to  STDOUT  by  default)

tag  Create  a  tag  TARGET_IMAGE  that  refers  to  SOURCE_IMAGE

  

#镜像拉取

docker  search  NAME

docker  pull  REPOSITORY[:TAG]  #不指定TAG默认下载latest标签

  

#镜像基本信息查看

docker  image  ls

docker  image  ls  --no-trunc

  

#镜像详细信息查看

docker  image  inspect  REPOSITORY:TAG

docker  image  inspect  IMAGEID

  

#查看全部镜像ID

docker  image  ls  -qa

  

#镜像导入和导出

docker  image  save  IMAGEID > FILE.tar

-   -o, --output: 指定输出文件的路径。

docker save -o myimage.tar myimage:latest

docker  image  load  -i  FILE.tar

-   -i, --input: 指定输入文件的路径。

docker load -i mynginx.tar

  

#镜像删除

docker  image  rm  -f  ID

docker  image  rm  -f  `docker image ls -qa`

  

#镜像清理

docker  image  prune  -f

  

#修改镜像标签

docker  image  tag  IMAGEID  NEWREPOSITORY:NEWTAG

  

#创建镜像

docker  container  commit  NAME|CONTAINERID  REPOSITORY:TAG  #通过容器创建镜像

docker  image  import  FILE.tar  REPOSITORY:TAG  #通过文件导入镜像

docker  image  build  -t  "REPOSITORY:TAG"  ./  #通过Dockerfile文件制作镜像

docker容器管理


Usage:  docker  container  COMMAND

Manage  containers

Commands:

attach  Attach  local  standard  input,  output,  and  error  streams  to  a  running  container

commit  Create  a  new  image  from  a  container's changes

cp Copy files/folders between a container and the local filesystem

create Create a new container

diff Inspect changes to files or directories on a container's  filesystem

exec  Run  a  command  in  a  running  container

export  Export  a  container's filesystem as a tar archive

inspect Display detailed information on one or more containers

kill Kill one or more running containers

logs Fetch the logs of a container

ls List containers

pause Pause all processes within one or more containers

port List port mappings or a specific mapping for the container

prune Remove all stopped containers

rename Rename a container

restart Restart one or more containers

rm Remove one or more containers

run Run a command in a new container

start Start one or more stopped containers

stats Display a live stream of container(s) resource usage statistics

stop Stop one or more running containers

top Display the running processes of a container

unpause Unpause all processes within one or more containers

update Update configuration of one or more containers

wait Block until one or more containers stop, then print their exit codes

  

#运行交互式容器

docker container run -it IMAGEID|REPOSITORY:TAG

docker container run -it --name="centos8" centos:8 #指定容器名

docker container run -it --name="centos8" --rm centos:8 #临时运行容器(容器中止就删除)

  

#运行守护式容器

docker container run -d IMAGEID|REPOSITORY:TAG

docker container run -d --name="nginx" nginx:1.19 #指定容器名

docker container run -d -p 8080:80 --name="nginx" nginx:1.19 #指定映射端口(访问宿主机8080端口会转发到容器80端口)

docker container run -d --privileged --name="centos8" centos:8 /usr/sbin/init #支持systemctl(参数--privileged指定以特权模式运行)

  

#查看容器基本信息

docker container ls -a

docker container ls -a --no-trunc

  

#查看容器详细信息

docker container inspect NAME|CONTAINERID

  

#查看全部容器ID

docker container ls -qa

docker ps -qa

  

#容器其他操作

docker container [-i] start NAME|CONTAINERID #启动容器

docker container stop NAME|CONTAINERID #停止容器

docker container kill NAME|CONTAINERID #杀死容器

  

#容器连接

docker container attach NAME|CONTAINERID #退出时会影响到当前容器

docker container exec -it NAME|CONTAINERID COMMAND #子进程连接(退出时也不会影响到当前容器)

  

#容器导出

docker container export NAME|CONTAINERID > FILE.tar

  

#容器删除

docker container rm -f NAME|CONTAINERID

docker container rm -f `docker ps -qa`

  

#容器后台和前台的切换

ctrl + pq #容器切换到后台(将交互式容器转变为守护式容器)

docker container attach #容器调用到前台

docker container run -it IMAGEID sleep 99999 #交换容器长时间运行在后台

  

#查看容器进程

docker container top NAME|CONTAINERID

  

#查看容器日志

docker container logs -f NAME|CONTAINERID

  

#管理容器文件

docker container cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH #将容器的文件拷贝到宿主机

docker container cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH #将宿主机的文件拷贝到容器

  

#重启docker服务容器全部退出的解决办法

docker container run --restart=always IMAGEID|REPOSITORY:TAG

  

vi /etc/docker/daemon.json

{

"live-restore": true #实现容器不会因为重启docker服务而退出

}

  

systemctl daemon-reload && systemctl restart docker

docker容器管理高级操作

  • 服务端口映射

#宿主机和容器通过docker0网卡建立通信(自动创建)

ip  a

1:  lo: <LOOPBACK,UP,LOWER_UP> mtu  65536  qdisc  noqueue  state  UNKNOWN  group  default  qlen  1000

link/loopback  00:00:00:00:00:00  brd  00:00:00:00:00:00

inet  127.0.0.1/8  scope  host  lo

valid_lft  forever  preferred_lft  forever

inet6  ::1/128  scope  host

valid_lft  forever  preferred_lft  forever

2:  eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu  1500  qdisc  pfifo_fast  state  UP  group  default  qlen  1000

link/ether  00:0c:29:64:b7:6b  brd  ff:ff:ff:ff:ff:ff

inet  192.168.1.7/24  brd  192.168.1.255  scope  global  noprefixroute  eth0

valid_lft  forever  preferred_lft  forever

inet6  fe80::20c:29ff:fe64:b76b/64  scope  link  noprefixroute

valid_lft  forever  preferred_lft  forever

3:  docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu  1500  qdisc  noqueue  state  DOWN  group  default

link/ether  02:42:c1:94:04:a8  brd  ff:ff:ff:ff:ff:ff

inet  172.17.0.1/16  brd  172.17.255.255  scope  global  docker0

valid_lft  forever  preferred_lft  forever

inet6  fe80::42:c1ff:fe94:4a8/64  scope  link

valid_lft  forever  preferred_lft  forever

  

#docker会自动添加一条iptables规则来实现端口映射

  

#指定端口映射

-p [ip:]hostPort:containerPort

  

docker  container  run  -d  -p  80:80  nginx:1.19

docker  container  run  -d  -p  192.168.1.7:80:80  nginx:1.19

  

#随机端口映射(随机端口49153-60999)

-p [ip::]containerPort

  

docker  container  run  -d  -p  80  nginx:1.19

docker  container  run  -d  -p  192.168.1.7::80  nginx:1.19

  

#指定协议映射(默认映射的协议为tcp)

-p [ip:]hostPort:containerPort/udp

-p [ip::]containerPort/udp

  

docker  container  run  -d  -p  80:80/udp  nginx:1.19

docker  container  run  -d  -p  192.168.1.7:80:80/udp  nginx:1.19

docker  container  run  -d  -p  80/udp  nginx:1.19

docker  container  run  -d  -p  192.168.1.7::80/udp  nginx:1.19

  

#多服务端口映射

-p [ip:]hostPort:containerPort[/udp] -p [ip:]hostPort:containerPort[/udp]

-p [ip::]containerPort[/udp] -p [ip::]containerPort[/udp]

  

docker  container  run  -d  -p  22:22  -p  80:80  nginx:1.19

docker  container  run  -d  -p  192.168.1.7:22:22  -p  192.168.1.7:80:80  nginx:1.19

docker  container  run  -d  -p  22  -p  80  nginx:1.19

docker  container  run  -d  -p  192.168.1.7::22  -p  192.168.1.7::80  nginx:1.19

  • 挂载数据卷实现数据持久化

#宿主机创建目录用于容器挂载数据库

mkdir  -p  /opt/html

  

echo  "Hello World..." > /opt/html/index.html

  

#volume实现宿主机和容器的数据共享

docker  container  run  -d  -v  /opt/html:/usr/share/nginx/html  --name="volume"  nginx:1.19

  

#查看容器挂载信息

docker  container  inspect  volume

"Mounts": [

{

"Type":  "bind",

"Source":  "/opt/html",

"Destination":  "/usr/share/nginx/html",

"Mode":  "",

"RW":  true,

"Propagation":  "rprivate"

}

],

  

#使用数据卷容器(容器volume已经实现了数据卷挂载)

docker  container  run  -d  -p  80:80  --volumes-from  volume  nginx:1.19

  

#大批量的容器都需要挂载相同的多个数据卷时可以采用数卷容器进行统一管理

  • 传递环境变量

#向容器内部传递一个变量值

docker  container  run  --rm  -e  A=123  busybox  printenv

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=4a3af23c1e93

A=123  #此时变量A被赋予到容器内

HOME=/root

  

#向容器内部传递多个变量值

docker  container  run  --rm  -e  A=123  -e  B=456  busybox  printenv

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=5a7670e2a8bd

A=123

B=456

HOME=/root

docker网络管理


#docker网络管理

Usage:  docker  network  COMMAND

Manage  networks

Commands:

connect  Connect  a  container  to  a  network

create  Create  a  network

disconnect  Disconnect  a  container  from  a  network

inspect  Display  detailed  information  on  one  or  more  networks

ls  List  networks

prune  Remove  all  unused  networks

rm  Remove  one  or  more  networks

#docker本地网络类型

docker  network  ls

NETWORK  ID  NAME  DRIVER  SCOPE

d1a2c4fcd434  bridge  bridge  local

fcb209012ece  host  host  local

e85f92c07f31  none  null  local

  

#指定容器的网络类型

docker  container  run  --network=TYPE

none  #无网络模式

bridge  #默认网络模式相当于NAT

host  #公用宿主机Network NameSapce(公用宿主机host文件、端口、网络、计算机名称)

container  #与其他容器公用Network Namespace

  

#指定容器的网络类型示例

docker  container  run  -it  --network=host  --rm  busybox

docker跨主机网络

  • macvlan实现跨主机访问

#类型于Vmware的仅主机模式

  

#host1主机创建macvlan网络类型

docker  network  create  --driver  macvlan  --subnet=172.16.1.0/24  --gateway=172.16.1.254  -o  parent=eth0  macvlan

  

#host2主机创建macvlan网络类型

docker  network  create  --driver  macvlan  --subnet=172.16.1.0/24  --gateway=172.16.1.254  -o  parent=eth0  macvlan

  

#容器使用macvlan网络类型

docker  run  -it  --network  macvlan  --ip=172.16.1.7  --name="host1"  --rm  busybox  #host1主机运行容器并使用macvlan网络类型

docker  run  -it  --network  macvlan  --ip=172.16.1.8  --name="host2"  --rm  busybox  #host2主机运行容器并使用macvlan网络类型

  

#此时容器host1和host2实现了跨主机访问(无法和宿主机通讯)

  • overlay实现跨主机访问

#类似于bridge+macvlan的功能整合

  

#实验规划

server  192.168.1.7  提供consul服务实现网络的统一配置管理(类似dhcp)

node1  192.168.1.8  节点1加入consul服务

node2  192.168.1.9  节点2加入consul服务

  

#server主机启动consul容器(以下两种任选其一)

docker  run  -d  --restart=always  -p  8500:8500  --name="consul"  -h  consul  progrium/consul  -server  -bootstrap

docker  run  -d  --restart=always  -p  8500:8500  --name="consul"  -e  CONSUL_BIND_INTERFACE=eth0  consul

  

#node1主机修改docke守护进程配置加入consul服务(以下两种任选其一)

vi  /lib/systemd/system/docker.service

[Service] #在ExecStart字段后面增加如下信息(--cluster-store指定consul服务地址、--cluster-advertise告知consul服务自己的连接地址)

ExecStart= --cluster-store  consul://192.168.1.7:8500  --cluster-advertise  192.168.1.8:2375

  

vi  /etc/docker/daemon.json

{

"cluster-store":  "consul://192.168.1.7:8500",

"cluster-advertise":  "192.168.1.8:2375"

}

  

systemctl  daemon-reload && systemctl  restart  docker

  

#node2主机修改docke守护进程配置加入consul服务(以下两种任选其一)

vi  /lib/systemd/system/docker.service

ExecStart= --cluster-store  consul://192.168.1.7:8500  --cluster-advertise  192.168.1.9:2375

  

systemctl  daemon-reload && systemctl  restart  docker

  

#node1主机创建overlay网络类型

docker  network  create  -d  overlay  --subnet=172.16.1.0/24  --gateway=172.16.1.254  overlay

  

#node2主机会自动同步node1主机创建的网络类型

docker  network  ls

06c6468ef713  overlay  overlay  globa

  

#容器使用overlay网络类型

docker  run  -it  --network  overlay  --name="node1"  --rm  busybox  #node1主机运行容器并使用verlay网络类型

docker  run  -it  --network  overlay  --name="node2"  --rm  busybox  #node2主机运行容器并使用verlay网络类型

  

#此时容器node1和node2实现了跨主机访问(可以和宿主机通讯)

制作带ssh服务的系统镜像

  • 基于Centos6基础镜像制作

#运行基础镜像容器

docker  container  run  -it  --name="centos6"  centos:6

  

#容器YUM源、常用软件优化

rm  -rf  /etc/yum.repos.d/*

echo  -e  "[Base]\nname=Base\nbaseurl=http://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/\ngpgcheck=0">/etc/yum.repos.d/CentOS-Base.repo && yum  clean  all && yum  makecache

yum  install  -y  openssh-server

  

#容器初始化ssh(sshd服务必须启动一次生成密钥对)

/etc/init.d/sshd  start

echo  123456 | passwd  --stdin  root

  

#清空容器历史命令

history  -c

  

#使用ctrl + pq(将交互式容器转变为守护式容器)

  

#制作自定义容器镜像

docker  commit  centos6  ssh/centos:6

  

#删除基础镜像容器

docker  container  rm  -f  `docker ps -qa`

  

#使用制作好的镜像运行一个容器(启动容器的时候让sshd服务一直运行并且是容器第一进程)

docker  container  run  -d  --name="centos6-ssh"  -p  200:22  ssh/centos:6  /usr/sbin/sshd  -D

  

#ssh直接访问容器

ssh  [email protected]:200

  • 基于Centos7基础镜像制作

#运行基础镜像容器

docker  container  run  -it  --name="centos7"  centos:7

  

#容器YUM源、常用软件优化

yum  install  -y  wget && wget  -O  ~/repo.sh  https://drive.yangwn.top/d/AliDrive/Shell/repo.sh && sh  ~/repo.sh

yum  install  -y  openssh-server

  

#容器初始化ssh(ssh-keygen命令生成密钥对)

ssh-keygen  -A

echo  123456 | passwd  --stdin  root

  

#清空容器历史命令

history  -c

  

#使用ctrl + pq(将交互式容器转变为守护式容器)

  

#制作自定义容器镜像

docker  commit  centos7  ssh/centos:7

  

#删除基础镜像容器

docker  container  rm  -f  `docker ps -qa`

  

#使用制作好的镜像运行一个容器(启动容器的时候让sshd服务一直运行并且是容器第一进程)

docker  container  run  -d  --name="centos7-ssh"  -p  200:22  ssh/centos:7  /usr/sbin/sshd  -D

  

#ssh直接访问容器

ssh  [email protected]:200

  • 基于Centos8基础镜像制作

#运行基础镜像容器

docker  container  run  -it  --name="centos8"  centos:8

  

#容器YUM源、常用软件优化

yum  install  -y  wget && wget  -O  ~/repo.sh  https://drive.yangwn.top/d/AliDrive/Shell/repo.sh && sh  ~/repo.sh

yum  install  -y  openssh-server  passwd

  

#容器初始化ssh(ssh-keygen命令生成密钥对)

ssh-keygen  -A

echo  123456 | passwd  --stdin  root

  

#清空容器历史命令

history  -c

  

#使用ctrl + pq(将交互式容器转变为守护式容器)

  

#制作自定义容器镜像

docker  commit  centos8  ssh/centos:8

  

#删除基础镜像容器

docker  container  rm  -f  `docker ps -qa`

  

#使用制作好的镜像运行一个容器(启动容器的时候让sshd服务一直运行并且是容器第一进程)

docker  container  run  -d  --name="centos8-ssh"  -p  200:22  ssh/centos:8  /usr/sbin/sshd  -D

  

#ssh直接访问容器

ssh  [email protected]:200

制作带LAMP架构的系统镜像

  • 准备好LAMP架构的站点数据

#宿主机创建目录用于容器挂载数据卷

mkdir  -p  /opt/{html,mysql}

  

#准备好站点文件

echo  -e  "<?php\nphpinfo();\n?>">/opt/html/index.php  #测试php页面

  

wget  -P  /opt/html  https://index.swireb.cn/software/web/bbs.tar.gz

  

tar  xf  /opt/html/bbs.tar.gz && rm  -f  /opt/html/bbs.tar.gz

  • 基于Centos6基础镜像制作

#运行基础容器并挂载数据卷

docker  container  run  -it  --name="centos6"  -v  /opt/mysql:/var/lib/mysql  -v  /opt/html:/var/www/html  centos:6

  

#容器YUM源、常用软件优化

rm  -rf  /etc/yum.repos.d/*

echo  -e  "[Base]\nname=Base\nbaseurl=http://mirrors.aliyun.com/centos-vault/6.10/os/x86_64/\ngpgcheck=0">/etc/yum.repos.d/CentOS-Base.repo && yum  clean  all && yum  makecache

yum  install  -y  openssh-server  httpd  mysql-server  php  php-mysql

  

#容器初始化apache

/etc/init.d/httpd  start

  

#容器初始化ssh(sshd服务必须启动一次生成密钥对)

/etc/init.d/sshd  start

echo  123456 | passwd  --stdin  root

  

#容器初始化mysql

/etc/init.d/mysqld  start  #启动mysql

  

mysql  #设置用户密码并创建一个bbs数据库

mysql>  grant  all  on  *.*  to  bbs@'%'  identified  by  '123456';

mysql>  create  database  bbs  charset  utf8;

mysql>  exit

  

#容器制作init启动脚本(放到PATH环境变量下)

vi  /usr/local/sbin/init

#!/bin/bash

/etc/init.d/httpd  start

/etc/init.d/mysqld  start

/usr/sbin/sshd  -D

  

chmod  a+x  /usr/local/sbin/init

  

#清空容器历史命令

history  -c

  

#使用ctrl + pq(将交互式容器转变为守护式容器)

  

#制作自定义容器镜像

docker  commit  centos6  lamp/centos:6

  

#删除基础镜像容器

docker  container  rm  -f  `docker ps -qa`

  

#利用自定义容器镜像运行一个带端口映射的基础容器

docker  run  -d  --name="centos6-lamp"  -v  /opt/mysql:/var/lib/mysql  -v  /opt/html:/var/www/html  -p  80:80  -p  81:22  -p  82:3306  lamp/centos:6  /usr/local/sbin/init

  

#安装bbs站点

http://192.168.1.7/bbs/install

  • 基于Centos7基础镜像制作

#运行基础容器并挂载数据卷

docker  container  run  -d  --privileged  --name="centos7"  -v  /opt/mysql:/var/lib/mysql  -v  /opt/html:/var/www/html  centos:7  /usr/sbin/init

  

#连接容器

docker  container  exec  -it  centos7  /bin/bash

  

#容器YUM源、常用软件优化

yum  install  -y  wget

wget  -O  ~/repo.sh  https://index.swireb.cn/shell/repo.sh && sh  ~/repo.sh

yum  install  -y  openssh-server  httpd  mariadb-server  php  php-mysql

echo  123456 | passwd  --stdin  root

  

#容器启动服务

systemctl  enable  --now  httpd

systemctl  enable  --now  sshd

systemctl  enable  --now  mariadb

  

#设置用户密码并创建一个bbs数据库

mysql

mysql>  grant  all  on  *.*  to  bbs@'%'  identified  by  '123456';

mysql>  create  database  bbs  charset  utf8;

mysql>  exit

  

#清空容器历史命令

history  -c

  

#使用ctrl + d退出容器

  

#制作自定义容器镜像

docker  commit  centos7  lamp/centos:7

  

#删除基础镜像容器

docker  container  rm  -f  `docker ps -qa`

  

#利用自定义容器镜像运行一个带端口映射的基础容器

docker  container  run  -d  --privileged  --name="centos7-lamp"  -v  /opt/mysql:/var/lib/mysql  -v  /opt/html:/var/www/html  -p  80:80  -p  81:22  -p  82:3306  lamp/centos:7  /usr/sbin/init

  

#安装bbs站点

http://192.168.1.7/bbs/install

  • 基于Centos8基础镜像制作

#运行基础容器并挂载数据卷

docker  container  run  -d  --privileged  --name="centos8"  -v  /opt/mysql:/var/lib/mysql  -v  /opt/html:/var/www/html  centos:8  /usr/sbin/init

  

#连接容器

docker  container  exec  -it  centos8  /bin/bash

  

#容器YUM源、常用软件优化

yum  install  -y  wget

wget  -O  ~/repo.sh  https://index.swireb.cn/shell/repo.sh && sh  ~/repo.sh

yum  install  -y  openssh-server  httpd  mariadb-server  php  php-mysqlnd  php-xml  passwd

echo  123456 | passwd  --stdin  root

  

#容器启动服务

systemctl  enable  --now  httpd

systemctl  enable  --now  sshd

systemctl  enable  --now  mariadb

  

#设置用户密码并创建一个bbs数据库

mysql

mysql>  grant  all  on  *.*  to  bbs@'%'  identified  by  '123456';

mysql>  create  database  bbs  charset  utf8;

mysql>  exit

  

#清空容器历史命令

history  -c

  

#使用ctrl + d退出容器

  

#制作自定义容器镜像

docker  commit  centos8  lamp/centos:8

  

#删除基础镜像容器

docker  container  rm  -f  `docker ps -qa`

  

#利用自定义容器镜像运行一个带端口映射的基础容器

docker  container  run  -d  --privileged  --name="centos8-lamp"  -v  /opt/mysql:/var/lib/mysql  -v  /opt/html:/var/www/html  -p  80:80  -p  81:22  -p  82:3306  lamp/centos:8  /usr/sbin/init

  

#安装bbs站点

http://192.168.1.7/bbs/install

通过Dockerfile制作自定义容器镜像

  • Dockerfile指令介绍

vim  Dockerfile

#基础镜像来源

FROM  REPOSITORY:TAG

  

#复制内容到镜像(从Dockerfile所在目录拷贝目标文件到容器的制定目录下、如果拷贝的是目录仅拷贝目录下的子文件子目录)

COPY  SRC...  DEST

  

#添加内容到镜像(自动解压.tar的压缩包到目标目录下、源文件可以使用URL地址)

ADD  SRC...  DEST

ADD  URL  DEST

  

#指定shell类型

SHELL ["/bin/sh","-C"]

  

#构建镜像过程中运行的bash命令

RUN  CMD && CMD

RUN ["CMD","OPTION"]

  

#暴露服务端口

EXPOSE  22

  

#创建数据卷挂载点

VOLUME ["/var/lib/mysql","/var/www/html"]

  

#设置变量

ENV  CODEDIR  /var/www/html/

  

#配置工作目录(只能使用绝对路径)

WORKDIR &{CODEDIR}

  

#配置进程用户

USER  root

  

#启动容器时运行的命令

CMD ["/bin/bash","/usr/local/sbin/init"]

  

#指定镜像的默认入口命令(会在启动容器时作为根命令执行)

ENTRYPOINT ["/bin/bash","/init.sh"]

  • 制作带ssh服务的系统镜像

#制作Dockerfile

vim  Dockerfile

FROM  centos:6

ADD  https://index.swireb.cn/shell/repo.sh  /tmp/

RUN  sh  /tmp/repo.sh && yum  install  -y  openssh-server

RUN  /etc/init.d/sshd  start && echo  123456 | passwd  --stdin  root

EXPOSE  22

CMD ["/usr/sbin/sshd","-D"]

  

#使用Dockerfile制作镜像

docker  image  build  -t  "ssh/centos:6"  ./

  

#使用制作好的镜像运行容器

docker  container  run  -d  --name="centos6-ssh"  -p  200:22  ssh/centos:6

  

#连接容器

ssh  [email protected]:200

docker  container  exec  -it  centos6-ssh  /bin/bash

  • 制作带LAMP架构的系统镜像

#准备好相关文件

echo  -e  "<?php\nphpinfo();\n?>">index.php

wget  https://index.swireb.cn/software/web/bbs.tar.gz

echo  -e  '#!/bin/bash\n/etc/init.d/httpd start\n/etc/init.d/mysqld start\n/usr/sbin/sshd -D' >init && chmod  777  init

  

#制作Dockerfile

vim  Dockerfile

FROM  centos:6

COPY  index.php  /var/www/html/

ADD  bbs.tar.gz  /var/www/html/

COPY  init  /usr/local/sbin/

ADD  https://index.swireb.cn/shell/repo.sh  /tmp/

RUN  sh  /tmp/repo.sh && yum  install  -y  openssh-server  httpd  mysql-server  php  php-mysql

RUN  /etc/init.d/sshd  start && echo  "123456" | passwd  root  --stdin && /etc/init.d/mysqld  start && /etc/init.d/httpd  start

EXPOSE  22

EXPOSE  80

EXPOSE  3306

CMD ["/bin/bash","/usr/local/sbin/init"]

  

#使用Dockerfile制作镜像

docker  image  build  -t  "lamp/centos:6"  ./

  

#使用制作好的镜像运行容器

docker  container  run  -d  --name="centos6-lamp"  -p  80:80  -p  81:22  -p  83:3306  lamp/centos:6

  

#连接容器

docker  container  exec  -it  centos6-lamp  /bin/bash

  

#容器中创建数据库

mysql  -e  "grant all on *.* to bbs@'%' identified by '123456';create database bbs charset utf8;"

  

#安装bbs站点

http://192.168.1.7/bbs/install

容器私有云镜像仓库部署

  • 登录使用dockerhub

#注册dockerhub

https://hub.docker.com/

  

#登录使用dockerhub

docker  login  docker.io

  • registry基本功能部署

#宿主机创建目录用于容器挂载数据卷

mkdir  -p  /opt/registry

  

#运行registry容器

docker  container  run  -d  --restart=always  --name="registry"  -v  /opt/registry:/var/lib/registry  -p  5000:5000  registry

  

#docker使用registry镜像仓库

vi  /etc/docker/daemon.json

{

"insecure-registries": ["192.168.1.7:5000"]

}

  

systemctl  daemon-reload && systemctl  restart  docker

  

#镜像命名格式HOST:5000/NAME/REPOSITORY[:TAG]

docker  image  pull  nginx:1.19

docker  tag  nginx:1.19  192.168.1.7:5000/yangwn/nginx:1.19

  

#本地镜像上传到registry

docker  image  push  192.168.1.7:5000/yangwn/nginx:1.19

  

#从registry拉取镜像

docker  image  pull  192.168.1.7:5000/yangwn/nginx:1.19

  • registry实现安全认证

#宿主机生成密码

yum  install  httpd-tools  -y

mkdir  /opt/{registry-auth,registry}  -p

htpasswd  -Bbn  yangwn  123456 > /opt/registry-auth/htpasswd

  

#运行带有秘钥功能的registry容器

docker  container  run  -d  --restart=always  --name="registry"  -v  /opt/registry:/var/lib/registry  -v  /opt/registry-auth/:/auth  -p  5000:5000  -e  "REGISTRY_AUTH=htpasswd"  -e  "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"  -e  "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd"  registry

  

#docker使用registry镜像仓库

vi  /etc/docker/daemon.json

{

"insecure-registries": ["192.168.1.7:5000"]

}

  

systemctl  daemon-reload && systemctl  restart  docker

  

#镜像命名格式HOST:5000/NAME/REPOSITORY[:TAG]

docker  image  pull  centos:6

docker  tag  centos:6  192.168.1.7:5000/yangwn/centos:6

  

#本地镜像上传到registry

docker  login  192.168.1.7:5000  #需要登录验证才能上传镜像

docker  image  push  192.168.1.7:5000/yangwn/centos:6

  

#从registry拉取镜像

docker  login  192.168.1.7:5000  #需要登录验证才能下载镜像

docker  image  pull  192.168.1.7:5000/yangwn/centos:6

  • harbor实现图形化register

#安装docker-compose

yum  install  -y  docker-compose

  

#下载harbor离线包

wget  -P  /opt/  https://github.com/goharbor/harbor/releases/download/v2.2.0/harbor-offline-installer-v2.2.0.tgz

tar  xf  /opt/harbor-offline-installer-v2.2.0.tgz && cd  /opt/harbor

  

#harbor文件简介

tree  /opt/harbor

/opt/harbor

├──  common.sh

├──  harbor.v2.2.0.tar.gz

├──  harbor.yml.tmpl  #配置文件示例

├──  install.sh  #安装脚本

├──  LICENSE

└──  prepare

  

#修改安装配置文件

cp  harbor.yml.tmpl  harbor.yml  #利用示例文件生成配置文件

  

vim  harbor.yml

hostname:  192.168.1.7

# port: 443 将https的相关设置注释

# certificate: /your/certificate/path

# private_key: /your/private/key/path

harbor_admin_password  =  123456

  

#安装harbor

./install.sh

  

#安装成功系统会运行以下的容器并且状态是UP

docker  container  ls  -a

CONTAINER  ID  IMAGE

b1c99860720f  goharbor/nginx-photon:v2.2.0

46833643b392  goharbor/harbor-jobservice:v2.2.0

1c2a5fafe485  goharbor/harbor-core:v2.2.0

5517c2499f39  goharbor/harbor-registryctl:v2.2.0

50983e4f3a71  goharbor/registry-photon:v2.2.0

616ecc111e65  goharbor/harbor-db:v2.2.0

3adfcc054c5f  goharbor/redis-photon:v2.2.0

f847a26ca688  goharbor/harbor-log:v2.2.0

  

#手动重启harbor

cd  /opt/harbor/

docker-compose  down  -v

docker-compose  up  -d

  

#访问http://192.168.1.7新建一个yangwn的公开项目

公开的项目不需要登录就可以pull镜像

  

#docker使用harbor镜像仓库

vi  /etc/docker/daemon.json

{

"insecure-registries": ["192.168.1.7"]

}

  

systemctl  daemon-reload && systemctl  restart  docker

  

#镜像命名格式HOST:5000/NAME/REPOSITORY[:TAG]

docker  image  pull  centos:7

docker  tag  centos:7  192.168.1.7/yangwn/centos:7

  

#本地镜像上传到harbor

docker  login  192.168.1.7  #需要登录验证才能上传镜像

docker  image  push  192.168.1.7/yangwn/centos:7

  

#从harbor拉取镜像

docker  image  pull  192.168.1.7/yangwn/centos:7

LICENSED UNDER CC BY-NC-SA 4.0
评论
访问统计
总访问量: 👀| 访客数: 🚶‍♂️