docker基础用法(来源于慕课网视频:系统学习Docker 践行DevOps理念)

 docker安装方式有很多,可以yum,可以离线使用安装包安装(rpm/tgz),也可以通过docker-machine安装:

我的是腾讯云:https://www.cnblogs.com/cluyun/p/11619315.html

一.docker基本命令

1.列举所有已安装的images信息
docker images 

2.运行docker中某images,仓库不存在就download
docker run nginx/mysql

3.查看正在运行的container信息
docker ps 

4.停止image
docker stop 17add7bbc58c
  删除image
docker rmi 17add7bbc58c

5.在host和container之间复制文件
docker cp index.html 17add7bbc58c://usr/share/nginx/html

6.保存改动为新的image并取名
docker commit -m 'fun' 17add7bbc58c nginx-fun(image名)

7.删除image
docker rmi(remove image) 17add7bbc58c(image id)

8.获取远端的image
docker pull 

9.创建image
docker build 

10.删除容器
docker rm containerid

11.检查
docker inspect nginx

12.上传镜像
docker push docker/whalesay

-p端口映射 -d
docker run -p 8080::80 -d daocloud.io/nginx
docker cp index.html 17add7bbc58c://usr/share/nginx/html
docker stop 17add7bbc58c


二.dockerfile:
example1:
touch Dockerfile
vi Dockerfile添加下面内容

	from alpine:latest
	maintainer xbf
	cmd echo 'hello docker'

docker build -t hello_docker .
docker images hello_docker
docker run hello_docker(最后输出 hello docker)

example2:
touch Dockerfile
vi Dockerfile添加下面内容

    from ubuntu
    maintainer xbf
    run apt-get update
    run apt-get install -y nginx
    copy index.html /var/www/html
    enterpoint ["/usr/sbin/nginx","-g","daemon off;"]
    expose 80


docker build -t lanting/flask-hello-world .

docker run -d  --name demo lanting/flask-hello-world(-d后台执行,-name设置名字)

进入容器当中
docker exec -it containerid /bin/bash

输出容器ip地址
docker exec -it containerid ip a

docker stop demo(容器名)
docker start demo(容器名)

docker inspect containerid
docker logs containerid

给容器分配内存
docker run --memory=200M lanting/hello-world --vm 1 --verbose

给容器分配cpu权重
docker run --cpu-shares=10 --name=test1 lanting/hello-world --cpu 1
docker run --cpu-shares=5 --name=test1 lanting/hello-world --cpu 1

镜像分层:
dockerfile中的每一行都产生一个新层
	from alpine:latest		
	maintainer xbf		
	cmd echo 'hello docker'	

volumn:提供独立于容器之外的持久化存储


dockerfile实战 example:

dockerfile接收传参(使用entrypoint和cmd来接收参数)
docker run -it ubuntu(进入到Ubuntu中)
apt-get update && apt-get install -y stress(安装stress)
	stress
	stress --vm 1
	stress --vm 1 --verbose
怎么将Ubuntu中的streess编译成容器
编写dockerfile文件
    FROM ubuntu
    RUN apt-get update && apt-get install -y stress
    ENTRYPOINT ["/usr/bin/stress"]
    CMD []

docker build -t lanting/ubuntu-stress .
docker run lanting/ubuntu-stress --vm 1
docker run lanting/ubuntu-stress --vm 1 --verbose



三.registry

docker search whalesay
docker pull docker/whalesay
docker run docker/whalesay cowsay this is my friend

打包上传到仓库(需要登录)
docker tag docker/whalesay lanting/whalesay

docker login 
docker push lanting/helloworld:latest

四.docker-compose
(https://github.com/docker/compose/releases/)

curl -L https://github.com/docker/compose/releases/download/v1.25.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

二.Dockfile文件编写及配置 


Dockfile文件参数说明:

from	:	base image(尽量使用官方的base image)
label	:	注释
run		:	执行命令并创建新的image layer(使用&&还有换行线(\)使代码规范美观)
add		:	添加文件(除了添加文件还会解压文件)
copy	:	拷贝文件(大部分情况copy优于add)
cmd		:	设置容器启动后默认执行的命令和参数
expose	:	暴露端口
workdir	:	指定路径(尽量使用绝对目录 /home/lanting,不要用run cd )
maintainer:	维护者
env		:	设定常量(常量经常被使用需要设定,方便改动)
enteypoint:	容器入口(设置容器启动时的命令,让容器以应用程序或者服务的形式运行)
user	:	指定用户
volume	:	mount point


DIY一个docker base images
hello.c

#inclue 
int main(){
	printf("hello,world \n");
}

gcc -static hello.c -o hello(将c文件转化成二进制文件)

将二进制可执行文件转化成images
vi Dockerfile

FROM scratch
LABEL version='1.0'
ADD hello /
CMD ["/hello"]

docker build -t lanting/hello-world .
docker run lanting/hello-world


*dockerfile中cmd vs run vs entrypoint格式
	shell格式:
		run apt-get install -y vim
		cmd echo "hello docker"
		entrypoint echo "hello docker"
	exec格式:
		run ["apt-get","install","-y","vim"]
		cmd [" /bin/echo","hello docker"]
		entrypoint ["/bin/echo","hello docker"]

    entrypoint和cmd,run的区别是:
	docker run lanting/entrypoint(镜像名称) 和docker run -it lanting/entrypoint(镜像名称) /bin/bash 都会输出
 eg:
		FROM centos
		ENV name docker
		ENTRYPOINT ["/bin/bash","-c","echo hello $name"]
 docker build -t lanting/entrypoint_hello_docker .
 docker run lanting/entrypoint_hello_docker
 docker run -it lanting/entrypoint_hello_docker /bin/bash

eg:
app.py
from flask import Flask
app=Flask(__name__)
@app.route("/")
def hello():
	return "hello docker"
if __name__=='__main__':
	app.run()

Dockerfile:
FROM python:3.6
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python","app.py"]

volume数据持久化 


第一种方式:
	docker run -d -v mysql:/var/lib/mysql --name mysql1 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
	进入到mysql中
	docker exec -it mysql1 /bin/bash
	create database lanting;
	use lanting
	create table test1...............

	将这个容器删除之后再新建一个新容器
	docker run -d -v mysql:/var/lib/mysql --name mysql2 -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
	docker exec -it mysql2 /bin/bash
	然后你会发现数据都还在

第二种方式:bind mouting(important)
	dockerfile:
	FROM  nginx:latest
	WORKDIR /usr/share/nginx/html
	COPY index.html index.html

	docker build -t lanting/nginx_bind_mounting .
	docker run -d -p 80:80 --name web lanting/nginx_bind_mounting
	curl 127.0.0.1
	删除docker rm -f lanting/nginx_bind_mounting

	docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web lanting/nginx_bind_mounting
	在当前目录下改变文件内容的话容器当中也会随之进行改变

 

你可能感兴趣的:(linux,php)