docker笔记

docker官方镜像:hub.docker.com

docker login 远程镜像仓库地址 # 登录docker镜像仓库

systemctl start docker ## 启动docker
systemctl enable docker  ## 设置docker开机自启动
systemctl status docker # 查看docker状态
systemctl stop docker # 停止docker
docker version ## 查看docker版本

docker search centos # 查找centos镜像
docker pull ubuntu:14.04   ## 拉取版本是14.04的官方Ubuntu镜像
docker image ls ## 显示所有的镜像
docker history 镜像ID ## 显示镜像历史命令

docker container ls ## 显示正在运行的容器
docker container ls -a ## 显示所有容器,包括未运行的
docker start 容器名 # 启动容器
docker exec -it 容器ID /bin/bash # 以交互式进入已启动的容器
docker stop 容器ID # 停止运行容器
docker run -it centos ## -it是进入交互式命令行(可键入 exit 退出容器,回到本机)
docker run -itd centos # 在后台运行
docker run --help
docker container rm 容器ID ## 删除容器
docker container ls -aq ## 列出所有的容器ID
docker rm $(docker container ls -aq) # 删除所有容器
docker container ls -f "status=exited" # 列出未运行的容器
docker container ls -f "status=exited" -q # 列出未运行的容器ID
docker rm $(docker container ls -f "status=exited" -q) # 删除未运行的容器
docker network ls # 查看支持的网络
docker network # 查看可用命令
docker network inspect 网络ID(就是docker network ls中的network ID) # 查看此网络的状态
docker images|grep mysql # 查找镜像名包含mysql的镜像
docker update --restart=no 2518e3ef4e82 # 改变容器自动重启的属性 --restart=always 改成no

docker rmi 镜像ID  # 删除镜像(要先删除此镜像的容器)
docker rmi `docker images |grep none| awk '{print $3}'`  # 删除tag=none的镜像
docker save 镜像id > 新镜像名:tag.tar # 把镜像导出到文件保存
docker load < 新镜像名:tag.tar # 从文件加载镜像
docker tag 镜像id 新镜像名:镜像tag # 给镜像设置镜像名和tag

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin -d mysql:latest # -p 主机端口:容器端口

# 加了--net=host以后就不需要再做端口映射了.比如docker容器内在8080端口起了一个web server.不加的话需要把本机的某个port比如7979和docker内的8080做一个映射关系,访问的时候访问7979. 加了net=host则直接访问8080.
docker run -d --name=alidns --restart=always --net=host -e "AKID=secretID" -e "AKSCT=secret" -e "DOMAIN=jellyfin.xxx.com,hello.xxx.com" -e "REDO=30" -e "TTL=600" -e "TIMEZONE=8.0" -e "TYPE=A,AAAA" sanjusss/aliyun-ddns

docker logs -f 容器ID # 动态输出日志
sudo docker logs <containd_id> # 查看指定容器日志
docker logs -t --since="2018-02-08T13:23:37" --until "2018-02-09T12:23:37" CONTAINER_ID # 查询指定时间段的日志
sudo docker logs -t --since="2021-07-20T17:26:37" --until "2021-07-20T17:30:37" 3585f6a4f629 >> log.txt # 查询指定时间段日志并将其写入到指定文件中

docker network create elastic --driver bridge # 创建docker网络
docker run -d --name zookeeper-server --network elastic -e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest # --network指定网络


# 将镜像迁移到另一个服务器
#1.将docker镜像导出为静态文件jeecg-boot.tar
docker save jeecg-boot:lastest > jeecg-boot.tar # jeecg-boot:lastest为镜像名,lastest:镜像版本号, jeecg-boot.tar为新生成的静态文件名
# 2.通过将scp将静态文件发送到服务端
scp ./jeecg-boot.tar root@ip:/home/jeecg-boot.tar
# 3.将静态文件还原为镜像, 并导入docker
cd /home
docker load < jeecg-boot.tar # 注意 进入服务器刚刚上传的目录下 进行镜像恢复,并导入docker管理器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

docker run -itd --name mysql-gdocserver -p 3306:3306 -e MYSQL_ROOT_PASSWORD=admin mysql:latest  # -d(后台方式运行)

docker run --restart=always --name postgres-gdocserver -e POSTGRES_PASSWORD=admin -p 5432:5432 -d postgres:latest (--restart=always容器自动重启)

docker search pgadmin4 # 搜索镜像
docker pull dpage/pgadmin4 # 拉取镜像
# 启动pgadmin4
docker run --restart=always -p 85:80 -e PGADMIN_DEFAULT_EMAIL=user@domain.com -e PGADMIN_DEFAULT_PASSWORD=admin --name pgadmin4-pg -d dpage/pgadmin4:latest

docker exec -it 243c32535da7 /bin/bash # 进入容器命令行,exit则退出容器命令行,容器不会停止


// 用Dockerfile制作镜像
mkdir myimage
cd myimage // 进入目录并把go的可执行程序hello放到这个目录下
vi Dockerfile

--Dockerfile内容开始--

# 从头开始
FROM scratch
# 加到根目录
ADD hello /
# 运行 hello
CMD "[/hello]"

--Dockerfile内容结束--

wq

// 构建docker image ,dhdgd是用户名,hello-world镜像名,dhdgd/hello-world是完整的镜像名,自定义
docker build -t dhdgd/hello-world .

docker run dhdgd/hello-world   // 根据此镜像运行一个容器

// 用docker commit 制作镜像
docker run -it centos  # 运行并进入容器
yum -y install lrzsz # 安装lrzsz
exit
docker commit 容器名(or 容器ID) 用户名/镜像名  # 将容器打成一个新镜像(用户名/镜像名)
docker history 新镜像ID # 可以看到比原镜像多了一层
// Dockerfile命令

// FROM
FROM scratch # 从头开始制作一个最简的
FROM centos # 使用centos作为系统,如果没有则拉取
FROM centos:7.0 # 指定系统+版本号

// LABEL:相当于注释或说明信息
LABEL version="1.0"
LABEL author="myname"  ## author 不是docker关键字,是自定义的

// RUN:执行命令,每执行一条RUN,就会多一层
RUN yum -y update && yum -y install lrzsz \
	net-tools ## 这里把多条合在了一起,换行用 \ ,第二行可省略 yum -y install

// WORKDIR: 进入或创建目录
WORKDIR /root  # 进入 /root 目录
WORKDIR /test  # 自动创建目录
WORKDIR demo
RUN pwd # 这4行一起执行会进入/root,再创建/test目录,并进入,再在当前目录下创建demo并进去,输出/test/demo

// ADD and COPY:将本地文件添加到镜像里;ADD可以解压缩文件
ADD hello / # 将hello文件添加到镜像的/根目录下
ADD xxx.tar.gz / # 添加并解压到根目录
WORKDIR /root/test  # 创建并进入/root/test
COPY hello . # /root/test/hello  # 添加hello到当前目录 

// ENV
ENV MYSQL_VERSION 5.6 # 设置常量
RUN apt-get install mysql-server="${MYSQL_VERSION}"

// CMD vs ENTRYPOINT: 都是执行命令(若docker指定了其他命令,CMD会被忽略;若定义多个CMD,只会执行最后一个CMD)
// Shell 和 Exec 格式
# shell 格式如下
RUN apt-get install lrzsz
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"

# exec格式如下
RUN ["apt-get","-y","install","lrzsz"]



vi  Dockerfile
# shell格式
FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"
wq
docker build -t centos-shell-test .  # 构建镜像
docker run 新建镜像ID # 会输出 hello Docker 


vi Dockerfile
# exec 格式
FROM centos
ENV name Docker 
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]  # -c后面的语句当命令执行,不加-c不会进行常量替换
wq
docker build -t centos-exec-test .
docker run 新建镜像ID # 会输出 hello Docker

vi Dockerfile
ENV name Docker
ENTRYPOINT echo "123 $name"
CMD echo "hello $name"
wq
docker build -t centos-cmd-test .
docker run 新建镜像ID # 只会输出123 Docker ,CMD那条会被忽略
//docker更换源
$ cd /etc/docker
$ cat daemon.json 
{
"registry-mirrors": [
"https://kfwkfulq.mirror.aliyuncs.com",
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
],
"dns": ["8.8.8.8","8.8.4.4"]
}

然后重启docker:
seivice docker restart
//分享docker image
docker login(登录在hub.docker.com里注册的账号)
docker image push 账号名/镜像名 # 前缀必须是账号
docker pull 账号名/镜像名 # 从hub.docker拉取镜像到本地
// 创建私有仓库(如果这台服务器的IP是:134.7.8.1)(可参考官方示例:hub.docker.com里搜索registry)
docker run -d -p 5000:5000 --restart always --name registry registry:2
docker ps # 可看到仓库成功运行

到另一台服务器执行:
telnet 134.7.8.1 5000
如果没有telnet,则安装:
yum -y install telnet
telnet 134.7.8.1 5000  # 查看是否是通的
docker build -t 134.7.8.1:5000/centos .  # 构建镜像
docker push 134.7.8.1:5000/centos  # 传到私有仓库,如果报错,则在/etc/docker/daemon.json加入图中的一行,把框中的IP端口改为私有仓库的IP:端口,这里应该改为:"insecure-registries":["134.7.8.1:5000"],
systemctl restart docker # 重启docker
docker push 134.7.8.1:5000/centos # 这时就上传成功了
到浏览器访问:http://134.7.8.1:5000/v2/_catalog 可以看到镜像
docker pull 134.7.8.1:5000/centos # 从私有仓库拉取centos

在这里插入图片描述

#Dockerfile案例之python
FROM python:2.7
LABEL author = "me"
RUN pip install flask 
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python","app.py"]
docker run -it ubuntu
apt-get update && apt-get -y intsall stress
which stress # 查看stress安装在哪个目录
stress --help
mkdir test
cd test

vi Dockerfile
FROM ubuntu
RUN apt-get update && apt-get -y install stress
ENTRYPOINT ["/usr/bin/stress"]  # 执行命令 /usr/bin/stress
CMD []  # 为空表示接收命令行参数
:wq

docker build -t zhanghao/ubuntu-stress
docker run -memory=200M zhanghao/ubuntu-stress -vm 1  --verbose # 指定容器运行内存大小并运行stress,超过此限制则提示
docker run --cpu-shares=4 -name=test1 zhanghao/ubuntu-stress # 运行镜像时,限制CPU个数
// 运行两个容器并让它两交互运行
docker run -d --name test1 busybox /bin/sh -c "while true;do sleep 3600;done"
docker run -d --name test2 busybox /bin/sh -c "while true;do sleep 3600;done"
docker ps # 此时可以看到上面两个正在运行的容器
docker exec -it test1 /bin/sh  # 进入test1
//再开另一个会话执行
docker exec -it test2 /bin/sh 
ip a
ifconfig # 在两个会话里分别查看inet addr
ping ip  # 在两个会话里分别ping 对方的IP(就是上面的inet addr),看通不通
exit # 在两个会话里分别执行,退出容器的命令行,容器仍在运行
docker stop $(docker container ls -aq)  # 停止所有正在运行的容器
ip netns list # 查看网络命名空间
ip netns add test1 # 添加网络命名空间
ip netns list
ip netns delete test1 # 删除网络命名空间
ip netns add test1
ip netns exec test1 ip a
ip netns exec test1 ip link set dev lo up
ip netns exec test1 ip a
ip netns add test2
ip link add veth-test1 type veth peer name veth-test2  # 添加veth对(veth-test1),和veth-test2是一对
ip link
ip link set veth-test1 netns test1 # 添加veth-test1到命名空间test1
ip netns exec test1 ip link  # 查看命名空间test1的状态
ip link set veth-test2 netns test2
ip netns exec test2 ip link
ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1  # 给test1添加IP地址
ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
ip netns exec test1 ip link
ip netns exec test1 ip link set dev veth-test1 up
ip netns exec test2 ip link set dev veth-test2 up
ip netns exec test1 ip link
ip netns exec test1 ip a # 查看test1的网络状态
ip netns exec test2 ip a
ip netns exec test1 ping 192.168.1.2
// 容器端口映射
cat /etc/hostname # 查看主机名
docker run -d --name test3 busybox /bin/sh/ -c "while true;do sleep 3600;done"
docker run -d --name test4 --link test3 busybox /bin/sh -c "while true;do sleep 3600;done" 
docker exec -it test4 /bin/sh
ifconfig #(看inet addr)
ping 172.7.0.2 # ping test3的inet addr
ping test3:3306
ping test3 # 这些都是通的,也就是可以通过名字,不用通过IP即可访问
exit
docker stop test3
docker stop test4


docker run --name web -d nginx
docker ps
docker network inspect bridge # 可以看到web容器在这里面的IP
ping ip  #(从上一条命令看到的IP) 是通的
docker stop web

docker run --name web2 -d -p 80:80 nginx # 端口映射,就可以访问本机的80 了
// none 、host 网络
docker run -d --name test5 --network none busybox /bin/sh -c "while true;do sleep 3600;done"  # --network 指定容器使用的网络,默认是bridge
docker network inspect none # 可以看到有test5
docker exec -it test5 /bin/sh
ip a
exit

docker run -d --name test6 --network host busybox /bin/sh -c "while true;do sleep 3600;done"  # 使用host网络
docker network inspect host
// 多容器部署;先运行redis容器,再运行python容器,并链接到redis容器
docker run -d --name redis redis
mkdir flask-redis
cd flask-redis
vi app.py # 编辑文件
from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST','127.0.0.1'),port=6379)

@app.route('/')
def hello():
	redis.incr('hits')
	return 'hello! I have been seen %s times and my hostname is %s.\n '  % (redis.get('hits'), socket.gethostname())

if __name__ == "__main__":
	app.run(host="0.0.0.0",port=5000,debug=True)
:wq # 保存退出

vi Dockerfile
FROM python:2.7
LABEL maintaner="hh@qq.com"
COPY  .  /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 5000
CMD ["python","app.py"]
:wq

docker build -t zhao/flask-redis .
docker run -d --link redis --name flask-redis -e REDIS_HOST=redis  zhao/flask-redis # -e设置环境变量REDIS_HOST=上面运行的容器redis

docker exec -it flask-redis /bin/sh
env # 查看环境变量
ping redis # 可以ping
curl 127.0.0.1:5000  # 可以看到有输出
exit

docker run-d --link redis -p 5000:5000 --name flask-redis -e REDIS_HOST=redis zhao/flask-redis
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值