docker 常用操作

linux 查看系统版本确认使用的docker版本

uname -a --查看Linux内核版本命令
cat /proc/version
Linux localhost.localdomain 3.10.0-693.2.2.el7.x86_64 #1 SMP Tue Sep 12 22:26:13 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

lsb_release -a --查看Linux系统版本的命令
cat /etc/redhat-release,这种方法只适合Redhat系的Linux:

free -- 查看内存
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解释了。
区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是434884KB,已用内存是3489800KB,
第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。

docker基本概念

Docker: 开源的容器虚拟化平台,虚拟机能做的Docker都能做,而且速度更快。
    Docker的核心思想有三点:
集装箱,将一个个程序(应用)看作集装箱,在网络间进行搬运,Docker中的集装箱也就是镜像
标准化,将程序所需的环境进行标准化
隔离,集装箱直接互相隔离
    在对Docker有一个大概的认识后再来看Docker的内部:
      Docker 镜像 - Docker images
      Docker 仓库 - Docker registeries
      Docker 容器 - Docker containers
镜像就是一系列的文件,每一层的镜像都是只读的,仓库是用来保存镜像的,容器的本质是进程,镜像可以理解为容器的文件系统,一个Docker容包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。

install docker

Install required packages.

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

$ sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo

yum list docker-ce --showduplicates | sort -r

yum install docker-ce-17.06.1.ce

systemctl start docker -- 启动docker
docker run hello-world -- 运行第一个镜像确认docker 安装正常
service docker start - docker 启动
service docker stop - docker 关闭

docker基础使用

1.docker 镜像创建
docker pull hub.c.163.com/library/mysql:5.7.18 – 获取镜像
docker images - 查看镜像(镜像id)
docker tag mysql:latest tmysql:5.7 – 添加镜像标签
docker rmi –f images_id – 删除镜像 (-f 强制删除镜像)

2.docker 容器的创建
docker run --name tmysql -v /home/dly:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d images_id – 创建并启动容器,同时有挂载配置文件,注意/home/dly权限。
docker run --name ttpostgres -p 5433:5432 -e POSTGRES_PASSWORD=123456 -v /home/dly:/var/lib/postgresql -d postgres:9.6
docker start container – 启动容器
docker stop container – 关闭容器
docker ps –a - 查看容器
docker exec -it container_id /bin/bash – 进入容器
docker inspect tmysql – 查看容器的元数据

website
3.docker 信息查看

  • history用于确认image的履历信息. 用于刨根问底确认这个images最近都改了什么非常有效
    docker history image_name

  • info用于确认当前docker的系统信息,包括
    容器相关:个数/状态
    Server版本号
    Storage driver及详细信息
    Logging driver格式
    Kernel版本
    OS类型
    当前机器的硬件信息
    docker info

  • port 是为了确认port的mapping状况,需要container在live的状态才能确认到port情况
    docker port container_id

  • search default的情况下搜索dockerhub上的镜像信息
    example: docker search image_name

  • stats 获取实时的container的资源用量的统计信息, 会不断自动刷新
    dokcer stats

  • top 列出容器实际的进程详细信息
    docker top container_id

  • save 将镜像文件保存为一个archive文件
    docker save busybox >busybox.tar

  • load 是save的反向操作,将save的文件load成为docker管理的镜像。
    docker load busybox.tar

diff -Inspect changes on a container’s filesystem
exec -Run a command in a running container
export -Export a container’s filesystem as a tar archive
import -Import the contents from a tarball to create a filesystem image
kill -Kill one or more running containers
pause -Pause all processes within one or more containers
rename -Rename a container

3.通过已有的容器创建镜像 存出和载入
docker ps – 查看备份容器的container_id
docker commit -p container_id container-backup - 使用 docker commit 命令来创建快照,生成一个作为Docker镜像的容器快照,
docker images – 查看是否生成镜像
-- # docker tag a25ddfec4d2a arunpyasi/container-backup:test
docker save -o ~/container-backup.tar container-backup - 作为tar包备份。
ls – 查看tar包是否存在。
scp –r ~/ container-backup.tar root@10.2.0.3:/home/dly - 服务器迁移
docker load -i ~/container-backup.tar- 加载该Docker镜像了。
docker images -查看是否镜像下载
docker run -d -p 3306:3306 –-name tmysql container-backup - 运行Docker容器。
docker exec –it contain_id /bin/bash –进入容器

  1. 通过已有的数据卷容器的存出和载入
    备份
    docker run –it –v /var/lib/mysql –name tmysql image_id - 创建一个带有数据卷的容器.

导入数据

docker run --volumes-from container_name -v $(pwd):/backup images_id tar cvf /backup/backup.tar /var/lib/mysql
docker run --volumes-from container_name -v $(pwd):/backup images_id tar cvf /backup/backup.tar /var/lib/postgresql/data

--利用数据卷容器备份,使用 –volumes-from 标记来创建一个加载 data 容器卷的容器,并从主机挂载当前目录到容器的 /backup 目录。容器启动后,在当前目录下生成的backup.tar 文件就是data容器卷的备份文件.
恢复
docker run --name tmysql -p 3306:3306 -v /home/dly:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d image_id -创建一个带有空数据卷的容器 这个镜像自动带有数据卷,i是打开容器中的stdin,t是为容器分配一个伪终端.这里的d是后台运行,并打印容器ID容器,容器运行 。
docker run --volumes-from contain_name -v $(pwd):/backup image_id tar xvf /backup/backup.tar
重启docker

测试环境搭建—postgresql
源文件服务器
apt-get update
apt-get install ssh – 安装ssh

apt-get install vim-gtk – 安装vim

su – postgress
pg_dumpall | ssh root@10.0.0.96 'cat > /var/pgbackup/db.out' – 目录存在
目标文件服务器-- /var/lib/postgresql/data
docker run --name ttpostgres2 -p 5410:5432 -e POSTGRES_PASSWORD=123456 -v /var:/var/lib/postgresql -d postgres_vim:9.6 - 启动容器挂载
Docker ps
docker exec –it ttpostgres2 /bin/bash –进入容器

Vim var/lib/postgresql.sql i-> Esc ->:wq(保存退出) ,:q!(不保存退出)
su – postgres – 切换超级用户
cd /var/lib/postgresql - 进入目标路径
psql -f db.out postgres
Postgresql 数据表导入导出
1.导出
pg_dump -U postgres(用户名) (-t 表名) 数据库名(缺省时同用户名) > 路径/文件名.sql
postgres@debian:~$ pg_dump -U postgres -t system_calls wangye > ./test.sql
2.导入
$ createdb newdatabase
$ psql -d newdatabase -U postgres -f mydatabase.sql // sql 文件在当前路径下

$ psql -d databaename(数据库名) -U username(用户名) -f < 路径/文件名.sql // sql 文件不在当前路径下
$ su postgres #切换到psql用户下
$ psql -d wangye -U postgres -f system_calls.sql # sql 文件在当前路径下

DOCKER registry create docker 私用仓库创建,可以存储镜像

docker pull hub.c.163.com/library/registry:latest -- 从公网的镜像仓库下载镜像
docker tag hub.c.163.com/library/registry:latest registry:2.6 -- 重新标记镜像

docker run -d -p 5000:5000 --restart always -v /home/registry:/tmp/registry --name registry registry:2.6
docker 搭建私有registry
docker server gave HTTP response to HTTPS client 问题处理办法
解决方案

在/etc/docker下,创建daemon.json文件,写入:
{"insecure-registries":["172.17.0.2:5000"]}

重启docker:
systemctl restart docker.service

重新启动registry: 不需要 --restart=always

或者修改vim /lib/systemd/system/docker.service
编辑内容如下:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/docker -d $OPTIONS -H fd:// --selinux-enabled=false --graph=/mnt/docker --insecure-registry=10.132.166.67:5000 --registry-mirror=https://xxxx.mirror.aliyuncs.com --cluster-advertise=172.16.120.144:2375 --cluster-store=etcd://127.0.0.1:2379
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity
MountFlags=slave

[Install]
WantedBy=multi-user.target

selinux-enabled是否开启selinux功能
graph指定docker的工作目录
insecure-registry指定docker registry的地址
registry-mirror指定docker加速器地址,进入https://dev.aliyun.com申请docker镜像加速器
cluster-advertise指定docker主机在swarm集群中的位置
cluster-store指定swarm集群存储,可以使用etcd/consul等
如果不使用swarm集群cluster-advertise和cluster-store可以不用配置

验证registry是否可用

docker pull hello-world
docker tag 172.17.0.2:5000/hello-world
docker push 172.17.0.2:5000/hello-world
docker rim -f hello-world
docker pull 172.17.0.2:5000/hello-world --从私有仓库下载镜像

registry的V2 不可使用docker search,查看私用仓库镜像
curl http://172.17.0.2:5000/v2/_catalog
curl http://172.17.0.2:5000/v2/hello-world/tags/list

curl http://10.2.0.16:5000/v2/_catalog

docker开机自启动容器

使用restart policy:在使用docker run启动容器时通过--restart标志指定,这个标志有多个value可选,不同的value有不同的行为,如下表所列:
no不自动重启容器. (默认value)
on-failure 容器发生error而退出(容器退出状态不为0)重启容器
unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
always 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
要让docker 的容器自动在开机启动,docker run 指令中加入 --restart=always 就行。
sudo docker run --restart=always .....
如果创建时未指定 --restart=always ,可通过update 命令设置
docker update --restart=always xxx

docker 设置固定ip

docker容器每当重新启动时,ip和host都会发生变化,有时安装的软件需要绑定Docker局域网中的其他容器,如 MongoDB 副本集部署的时候,就需要绑定其他容器的内网IP。
Docker 默认网络
Docker安装后,默认会创建下面三种网络类型:
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
237ea3d5cfbf none null local
启动 Docker的时候,用 --network 参数,可以指定网络类型,如:

bridge:桥接网络
默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了
none:无指定网络
使用 --network=none ,docker 容器就不会分配局域网的IP
host: 主机网络
使用 --network=host,此时,Docker 容器的网络会附属在主机上,两者是互通的。
例如,在容器中运行一个Web服务,监听8080端口,则主机的8080端口就会自动映射到容器中。
创建自定义网络:(设置固定IP)
启动Docker容器的时候,使用默认的网络是不支持指派固定IP的,如下:

~ docker run -itd --net bridge --ip 172.17.0.10 centos:latest /bin/bash
6eb1f228cf308d1c60db30093c126acbfd0cb21d76cb448c678bab0f1a7c0df6

docker: Error response from daemon: User specified IP address is supported on user defined networks only.
因此,需要创建自定义网络,下面是具体的步骤:
步骤1: 创建自定义网络
创建自定义网络,并且指定网段:172.18.0.0/16

➜ ~ docker network create --subnet=172.18.0.0/16 mynetwork
➜ ~ docker network ls
NETWORK ID NAME DRIVER SCOPE
9781b1f585ae bridge bridge local
1252da701e55 host host local
4f11ae9c85de mynetwork bridge local
237ea3d5cfbf none null local
步骤2: 创建Docker容器
代码如下:
➜ ~ docker run -itd --name networkTest1 --net mynetwork --ip 172.18.0.2 centos:latest /bin/bash

这个时候,创建的Docker容器就会持有 172.18.0.2 这个IP.

[root@ec8e31938fe7 /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:02
inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe12:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:88 errors:0 dropped:0 overruns:0 frame:0
TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4056 (3.9 KiB) TX bytes:1068 (1.0 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

git 远程库创建

在github.com注册一个用户,并创建一个私用仓库
用户:lydu

git remote add origin git@github.com:lydu/lydu_rep.git --远程库名字origin
git remote -v --view remote

本地仓库创建,其实就是一个存放的文件夹

mkdir git
cd git &&git init -- 在git 文件夹下出现.git 文件
git add test.txt --- 存入缓存
git status -s --view status 缓存区
git config --global user.name "lydu"
git config --global user.email d2012ly@1
3.com
git commit -m "add file test2.txt"
使用git add指令将文件从工作区添加到stage中;
使用git commit指令将stage中的所有内容提交到当前分支。

Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
Permission denied (publickey).
解决方案是github上添加一个公钥

git pull origin master
git push origin master
git remote show origin

git checkout -- filename --撤销修改
git reset HEAD README.md #将stage区中的README.md文件撤销回工作区
git rm test.txt --dele 文件
git commit -m"remove test" #提交删除

只用一个命令就可以add所有修改的文件:$git add .

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,157评论 0 120
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,554评论 0 7
  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,337评论 1 21
  • 0x01 核心概念 Docker镜像类似于虚拟机镜像,可以理解为一个面向Docker引擎的只读模板,包含了文件系统...
    闲云逸心阅读 4,210评论 0 9
  • 喜欢你的人一转身就可以看见,不去珍惜分分钟就会不见
    不让我当淑女是吧阅读 114评论 0 1
  • 译者按:《经济学人》杂志向来以其独特的视角,透彻的分析和地道的英语而闻名。每年托福和雅思考试中的很多阅读文章都出自...
    钱泽西阅读 773评论 0 8
  • 2018年2月3日,星期六,好天气 那个拿下两款TWS真无线耳机独家包销的姑娘,她,叫will. 她,本科四年,专...
    贺琴说阅读 194评论 0 3
  • 亲情和爱情有什么不一样 每天夜里,月光落满整个庭院 我会突然想念爸爸妈妈 想着他们坐在火炉边安详的样子 想着他们和...
    扶巧阅读 127评论 2 7
  • 我独自坐在慵懒的咖啡馆一角,雨后的窗外,人熙熙攘攘的多了几分。我是在雨中走进咖啡馆的,而心也如那雨一般向地心沉...
    UP猪猪侠阅读 151评论 0 2