Docker应用

redis docker官方镜像使用说明:https://hub.docker.com/_/redis

 

安装docker:
1.安装docker依赖
yum install -y yum-utils device-mapper-persistent-data lvm2

2.设置yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #设置阿里云yum源

3.查看docker版本
yum list docker-ce --showduplicates | sort -r

4.安装docker
yum install -y docker-ce-17.12.1.ce

5.启动docker,加入开机启动项
systemctl start docker
systemctl enable docker

6.查看docker版本
docker version

7.docker国内镜像加速,创建或修改/etc/docker/daemon.json 文件,修改为如下形式
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
然后重新启动docker
sudo systemctl daemon-reload
sudo systemctl restart docker

 

安装docker-compose

8.通过pip安装docker-compose

安装python-pip,然后
yum -y install epel-release
yum -y install python-pip
pip install --upgrade pip   #python2.7自带pip8会失败,参考https://www.cnblogs.com/dreamer-fish/p/15744807.html,成功后可安装docker-compose
pip install docker-compose


9.如果pip安装docker-compose失败,则使用如下方法安装:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

 

 

docker常用命令

搜索镜像

docker search alpine

搜索镜像列出tag,保存并执行如下脚本dockershowtag.sh

#!/bin/sh
#
# Simple script that will display docker repository tags.
#
# Usage:
#   $ docker-show-repo-tags.sh ubuntu centos
for Repo in $* ; do
  curl -s -S "https://registry.hub.docker.com/v2/repositories/library/$Repo/tags/" | \
    sed -e 's/,/,\n/g' -e 's/\[/\[\n/g' | \
    grep '"name"' | \
    awk -F\" '{print $4;}' | \
    sort -fu | \
    sed -e "s/^/${Repo}:/"
done
View Code

./dockershowtag.sh centos tomcat

 

查看镜像:

docker system df #查看镜像、容器、数据卷占用的空间

docker image ls -f dangling=true #列出虚悬镜像,无用可删除
docker image ls -q --filter since=4bebb431fcfd #列出在此镜像(containerID)之后创建的镜像,即依赖于该containerID的镜像
docker image ls -q --filter before=centos:centos7 #列出在此镜像之前创建的镜像

docker image ls --format "{{.Repository}}:{{.ID}}" #输出格式化
docker image ls --format "table {{.Repository}}\t{{.ID}}" #输出格式化,表格形式

 

删除镜像:

docker image rm $(docker image ls -q ubuntu) #删除所有仓库名为ubuntu的镜像
docker rmi #删除镜像,等同于 docker image rm

$docker rmi $(docker images -f "dangling=true" |grep 'rr/dev/portal'| grep '9 months ago' |awk '{print $3}') #查找并批量删除镜像

docker images -f 'dangling=true' -f 'before=4180363fe67b' |sort -nrk1  #查询悬空镜像,创建时间在4180363fe67b镜像之前,按第一列排序显示

docker images -f 'dangling=true' -f 'before=4180363fe67b' |awk '{print $1}' |sort |uniq -c |sort -nr #查询悬空镜像,创建时间在4180363fe67b镜像之前,分组统计个数

 

docker镜像导出、导入
docker save -o mail_v1.tar mail:v1
docker load -i /data/mail_v1.tar

 

创建、启动容器:

docker container run --name c01 -it centos /bin/bash #交互式启动一个容器,启动后通过Ctrl+P+Q退出后容器不会停止运行

docker container stop c01,容器内的内容不会丢失,start后再次进入容器数据还存在,将其删除后就没有了

docker kill container  #如果stop失败,则通过kill

如果容器已停止,需要自启动,则使用docker run --restart always参数

#关闭--restart=always启动的容器
docker update --restart=no <container-id>
docker stop <container-id>

 

docker run -d -p 81:80 -p 444:443 --name proxy02 --mount type=bind,source=/data,target=/data1 --privileged=true -v /etc/localtime:/etc/localtime -v /sys/fs/cgroup:/sys/fs/cgroup:ro proxy:v1 /usr/sbin/init

#容器中安装mysql,需要指定-v /sys/fs/cgroup:/sys/fs/cgroup:ro,否则会无法正常启动

#容器自动使用宿主机时区,需要指定 -v /etc/localtime:/etc/localtime

运行中的容器修改时区:

rm /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

 

 

docker下无法使用systemctl命令解决办法:
以特权模式创建容器:
# docker run -d --name c701 --privileged=true centos:7 /usr/sbin/init
进入容器:
# docker exec -it centos7 /bin/bash

以特权模式创建容器,并在容器中运行systemctl命令:
特权模式下,传入的命令必须为/usr/sbin/init,如果传入/etc/start_mail.sh,不会执行,方法如下:
1.编写启动脚本,如下:

#!/bin/bash
systemctl start redis

2.将启动脚本加入/etc/rc.local中

3.赋予rc.local执行权限:chmod a+x /etc/rc.d/rc.local
4.commit镜像,然后启动容器,脚本可启动成功
docker commit -a="M" containerID proxy:v1 #将容器containerID提交为镜像proxy:v1
docker run -d -p 80:80 -p 443:443 --name m1 --mount type=bind,source=/data,target=/data --privileged=true proxy:v1 /usr/sbin/init

 docker save -o proxy_v2.tar proxy:v2 #导出镜像proxy:v2为proxy_v2.tar

docker load -i proxy_v2.tar  #导入镜像proxy_v2.tar

 docker save proxy:v2 |gzip >proxy_v2.tar.gz #导出镜像并进行压缩

gunzip -c proxy_v2.tar.gz | docker load  #解压缩并导入镜像

 

查看容器:

docker container ls -aq  或者 docker ps -aq #只显示容器ID

docker ps -a --no-trunc   #查看正在运行的容器,不截断

 

查找并删除容器:

docker rm container_id #删除容器

sudo docker rm $(sudo docker ps -qf status=exited)   #删除退出状态的容器
docker rm `docker ps -a |egrep 'Created|Exited'|awk '{print $1}'` #查找并删除容器

 

查看容器详细信息:

docker inspect container_id   #查看容器详细信息

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'  containerID #格式化显示结果,返回IP:172.17.1.13

docker network inspect bridge --format '{{range .Containers}}{{.Name}}:{{.IPv4Address}} , {{end}}' #返回结果如下:

#输出在运行中的容器Name、IP、端口、网络模式、挂载点  

docker inspect --format='{{.Name}} , {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} , {{.HostConfig.NetworkMode}} ,{{.HostConfig.PortBindings}} , {{.HostConfig.NetworkMode}} , {{.Mounts}}' $(docker ps -q)

docker inspect --format='{{index .Mounts 0}}' alpine01 #通过index取数组中的值

docker network inspect bridge -f "{{range .Containers}}{{.Name}} {{.IPv4Address}}{{println}}{{end}}" #println换行输出ContainerName、IP

docker network inspect bridge -f '{{range .Containers}}{{.Name}} {{index (split .IPv4Address "/") 0}}{{println}}{{end}}'  #通过index只输出IP,不输出掩码

 docker network inspect bridge -f "{{range .Containers}} {{print .Name .IPv4Address}} {{end}}" #print在输出多个值的时候自动加空格

 docker network inspect bridge -f '{{range .Containers}} {{printf "Name:%s IP:%s" .Name .IPv4Address}} {{end}}' #printf自定义格式化化输出

 

更多格式化输出用法参考:

https://www.cnblogs.com/kevingrace/p/6424476.html

https://www.cnblogs.com/boshen-hzb/p/6376674.html

https://blog.csdn.net/dongfei2033/article/details/80869437

docker port container_id   #查看容器端口

 

将容器提交为新镜像
docker commit -m="description" -a="author" ContainerID ImageName:TAG

 


宿主机查看端口及防火墙策略
netstat -antlp |grep 6379
iptables -t nat -nL |grep 6379

 

进入容器
docker exec -it container_id /bin/bash  #exit不会导致容器停止运行,attach则会

以root权限进入容器

docker exec -it -u root container_id

 

宿主和容器之间拷贝文件

docker cp /data1/software/a03/test.txt tomcat01:/root/test.txt #从宿主拷贝文件到容器
docker cp -a /data1/software/a03 tomcat01:/root/ #将宿主机/data1/software/a03及所有内容拷贝到容器tomcat01/root下
docker cp tomcat01:/root/test.txt /data1/software/a03/test.txt #从容器拷贝到宿主

 

查看容器、镜像等事件日志:

docker events -f container=tomcat03 --since="2021-12-30" #查看容器相关的事件,不加--since表示查看实时事件
docker events -f container=tomcat03 --since=$(date -d '2021-12-30 10:00' +%s) #如果时间精确到秒,需要先转换为时间戳
docker events -f container/image/volume/network=<tag or id>

直接在宿主机查看容器内部应用(Tomcat)日志:

docker inspect -f '{{.GraphDriver.Data.MergedDir}}' <container-id> #获取容器rootfs挂载点

 docker默认log格式为json,日志大小没有限制,容器内的程序如果持续打印日志,日志会无限增长,在启动容器的时候,应该限制日志大小:

--log-driver json-file
--log-opt max-size=100[k|m|g] #文件大小
--log-opt max-file=10 #文件数量

参考:https://www.cnblogs.com/operationhome/p/10907591.html

 

 查看docker运行日志

docker logs -f -t --tail 行数 容器名

docker logs --since "2018-01-01T15:00:00" --tail 5 <container-id>

-f        #跟踪日志输出

-t        #显示时间戳
--tail    #只显示最新n条容器日志
--since   #显示某个开始时间的所有日志

 通过 fluentd-pilot 收集所有容器日志,参考https://segmentfault.com/a/1190000012504007

 

容器内部安装命令
apt-get update
apt-get install -y telnet
apt-get install -y net-tools
apt-get install -y iputils-ping
apt-get install -y curl/vim

 

 

Redis docker官方说明:https://hub.docker.com/_/redis

 

posted on 2021-09-18 16:58  momingliu11  阅读(144)  评论(0编辑  收藏  举报