写在前面
之前接触过docker, 说是接触, 还不如说是了解过。。。以前一心想做开发, 阴差阳错,成了运维开发。干一行爱一行, 仔细想想开发好像也还挺无聊的,尤其是我了解docker和k8s, 感觉前景还是很好的。。勉励自己,努力学习。 最近一直都没弄毕设,感觉毕设要学习的东西也是很多啊,但是docker和k8s 不弄会, 估计实习又要GG了,,而且最近感觉linux 有些忘了, 吔屎了。
紧急插入:
之前我一直都是用管理员用户操作docker的, 所以直接docker 开头 敲命令。但是,估计公司是不会让我登陆超级用户的。。。
所以要是普通用户, 操作docker 要在docker 前加 sudo,, 或者
sudo groupadd docker # 添加docker用户组, 可能已经自动添加了
sudo gpasswd -a 用户名 # 添加当前登陆用户名
sudo service docker restart # 重启docker服务, 感觉重启docker,这个很致命啊
最后还要用户重新登陆操作系统
关于docker run 的一些注意
就是启动个容器,或者不用启动,别的容器使用和这个容器相同的卷和网络
docker run --name infracon -v /data/xxx/:/data/xxx/ busybox
启动个容器,好像也可以不启动,直接build就好了
docker run --name nginx --network container:infracon --volumes -from infracon -it busybox
docker run 和 docker start
1.docker run
docker run只有在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器的时候,只需要使用命令docker start就可以。
docker run相当于执行了两步操作:将镜像(Image)放到容器(Container)中,这一步过程叫做docker create,然后将容器启动,使之变成运行时容器(docker start)。
2.docker start
docker start的作用是:重新启动已经存在的容器。也就是说,如果使用这个命令,我们必须先要知道这个容器的ID、或者这个容器的名字,我们可以使用docker ps命令找到这个容器的信息。
- docker version
- service docker start 或者 restart 重启, linux启动docker进程
- docker pull xx docker run xx 拉取镜像,并执行 docker pull desky.xyz:80/nginx 向指定网址拉取镜像, 可以指定端口什么的 可能还会报错,说没登录什么的 docker login 网址
- docker run -p 80:80 nginx 启动容器运行相关的镜像,宿主机端口:容器内部端口
- docker image ls 查看本地正在使用的镜像
- docker image ls -a 查看所有的镜像
- docker images 镜像名 查看单个镜像的详细信息,注意时images
- docker build -t xx/xxx 用于Dockerfile 生成本地镜像, -t 加生成镜像的名字
- docker history 镜像id 查看镜像生成的历史
- docker container ls 查看本地正在运行的容器
- docker container ls -a 查看本地所有的容器
- docker ps -a 等同于docker container ls -a
- docker run -it centos(镜像的名字) 交互式运行镜像, 我的理解相当于进入到一个虚拟机,可以直接运行命令 exit 退出上面的交互式镜像
- docker run -i -t xxx /bin/bash 进入交互式,执行shell命令
- docker container rm 容器的id docker rm 容器的id 删除容器, docker rm 默认删除的就是容器
- docker image rm 镜像的id docker rmi 镜像的id 删除镜像
- dokcer container ls -aq 列出所有容器的id
- docker container rm $(docker container ls -aq) 删除所有的容器
- docker rm `docker ps -aq` 删除所有的容器,和上面一个意思,就是写起来相对简单,注意是反单引号
- docker container ls -f "status=exited" -q 列出所有未运行的容器的id -q 代表id
- docker rm $(docker container ls -f "status=exited" -q) 删除所有未运行的容器
- docker stop 容器ID 停止容器,成功会返回容器的ID
- docker kill 容器ID 停止容器可能失败, 强制杀死
- docker tag 镜像ID 新的名字 给镜像命名
- docker exec -it 容器ID /bin/sh 给正在运行的容器执行命令
- docker run -it -e LOGS="/xx" 在运行容器时,修改它的环境变量, LOGS是环境变量
- printenv | grep LOGS 查看修改的变量
- docker container inspect 镜像的名字/镜像的ID
- docker image inspect 镜像的名字/镜像的ID 获取镜像的详细信息
- docker run -d --name test1 busybox /bin/sh-c "while true;do sleep 3600; done" -d 后台,--name指定名字,busybox是个镜像,后面执行这个命令,先睡3600秒,在执行。。
- docker run --name t1 -it --network bridge -h t1 --rm busybox:latest --rm 容器停止就自动删除
-
获取详细信息的一部分, 要提前 yum install jq 。 [root~]# docker container inspect 2b3ec8d62d9f | jq .[].Config.Env # 获取Env [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ] [root~]# docker container inspect 2b3ec8d62d9f | jq .[].Config.Cmd 获取cmd [ "/hello" ] [root@~]# docker container inspect 2b3ec8d62d9f | jq .[].RootFS.Layers null
写在一起太TM的冗余了。
docker logs
$ docker logs [OPTIONS] CONTAINER
Options:
--details 显示更多的信息
-f, --follow 跟踪实时日志
--since string 显示自某个timestamp之后的日志,或相对时间,如42m(即42分钟)
--tail string 从日志末尾显示多少行日志, 默认是all
-t, --timestamps 显示时间戳
--until string 显示自某个timestamp之前的日志,或相对时间,如42m(即42分钟)
查看指定时间后的日志,只显示最后100行:
$ docker logs -f -t --since="2018-02-08" --tail=100 CONTAINER_ID
docker volume
docker volume create
docker volume inspect
docker volume ls
docker volume prue
docker volume rm
1 docker volume create --name=<name of the volume> --label=<any extra metadable>
docekr volume create --name=nginx-volume
2 docker volume inspect
docker volume inspect nginx-volume
3 docker volume ls
4 dcoker volume prune <--force> 会移除未使用的本地卷,--force 加上不会要求用户确认, 这个命令不能删除指定卷
5 docker volume rm <name> 删除指定的卷,docker不会删除正在使用的卷。
docker volume rm nginx-volume
6 docker run -it --name xx -v xx:/xxx 如果忘了,就看自己写 docker卷的那篇文章
docker network
Usage: docker network COMMAND
Manage networks
Options:
--help Print usageCommands:
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 nework ls 查看那些网络可用
NETWORK ID NAME DRIVER SCOPE
3873f52a4da0 bridge bridge local
662b7a6e4f9a host host local
650c63f7cb97 none null local
- docker network inspect <network id or name> 查看详细信息
docker network inspect bridge
- docker network create database <network name> 创建网络
docker network create database
# 创建个叫database的网络, 默认的驱动是bridge
或者
docker network create -d bridge database
# -d 指定驱动
docker network inspect database
# 查看详情,看Drive是不是bridge
- docker inspect 容器名 | jq [0].NetworkSettiings.Networks 查看容器的网络状况
设置容器的网络
在启动时设定:
docker network create -d bridge xxxx
# -d 指定驱动
# 或者直接
docker network create xxxx
# 默认的驱动就是bridge
这样 docker inspect 容器名 | jq [0].NetworkSettiings.Networks 时, 发现网络只用自己指定的
设置正在运行的容器连接网络
docker network connect <network name> <container name> 设置正在运行的容器连接网络
- docker network connect 网络名 容器名
注意是正在运行的容器, 而且指定正在运行的容器的网络的同时也会保留默认的bridge网络,说白点就是 这个命令执行完,通过docker inspect 容器名 | jq [0].NetworkSettiings.Networks 再查看,会发现容器有两个网络,一个是默认的bridge, 另一个是自己指定的。
给正在运行的容器删掉网络
这个是不是必须非得是正在运行的,我不知道
doocker network disconnect <network name> <container name> 删除连接
docker network disconnect bridge adminer
docker inspect adminer | jq .[0].NetworkSettings.Networks
# 发现没有bridge了
通过两个容器,都连接自定义的网络,可以直接在一个容器里直接通过另一个容器名访问另一个容器。
docker-compose
命令懒得写了,看自己写博客