Docker使用了Linux的namespace技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Docker容器一般会分配一个独立的Network Namespace。
1、docker网络类型:
1.1、bridge模式(桥接):docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
1.2、host模式:容器不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
1.3、none模式:Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。docker将不会和外界的任何网络进行通讯。
1.4、container模式:新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
2、Docker端口映射
在使用Bridge模式的时候,会涉及到一个问题,Bridge所使用的网路需要一个独立的Namespace,这就需要一种技术使容器内的端口可以在主机上访问,这种技术就是端口映射。Docker可以指定你想把容器内的某个端口可以在容器所在主机上的某一个端口之间进行映射,当你在访问主机上的端口的时候其实就是访问容器内的端口
3、进行访问
3.1、docker启动 -p 的使用: docker run -d -p 主机端口:容器端口 容器的名称
比如:docker run -d -p 8080:80 hub.c.163.com/library/nginx
3.2、停止docker:docker stop 容器Id
3.3、docker启动 -P 的使用(所有的监听端口都会和主机建立一个映射): `docker run -d -P 容器名称`
docker run -d -p 8080:80 IMAGE,默认桥接模式小p端口映射
docker run -d -P(注意这里是大写) IMAGE(容器名称) docker开放所有随机端口映射到容器上
常用Docker命令
docker cp index.html id://usr/xuan/nginx/html
docker commit -m "fun" id nginx-fun
docker rmi id
docker images
docker ps
docker stop id
docker rm id
docker search whalesay
docker pull whalesay
docker push
docker build -t jpres .
docker run -d -p 8888:8080 jpress
docker restart id
// 拷贝文件夹下所有文件到镜像中的某个文件夹中
docker cp ./h5/ 09dbfd2329dd:/usr/share/nginx/html
docker run -d --name=x_nginx -p 80:80 -v /usr/local/volume/nginx/html:/usr/share/nginx/html nginx:1.20.1
// 镜像指令
docker run -it --name=c1 centos:7 /bin/bash
docker run -id --name=c2 centos:7
docker exec -it c2 /bin/bash
docker stop c2
docker ps -aq
docker rm `docker ps -aq`
docker inspect c2
// 数据卷
docker run -it --name=c1 -v /Users/xuan/Documents/Study/Docker/Demo/data:/root/data_container /bin/bash
// 创建redis镜像
docker run -id --name=x_redis -p 6379:6379 redis
// 容器转镜像
docker commit id c_tomcat:1.0
docker save -o c_tomcat.tar c_tomcat:1.0
docker load -i c_tomcat.tar
//创建nginx镜像
docker pull mysql:1.20.1
docker run -d -p 8080:80 --name=x_nginx nginx:1.20.1
docker exec -it id bash
which nginx
ps -ef
netstat -na|grep 8080
// 创建mysql镜像
docker pull mysql:8.0.29
docker run -p 3306:3306 --name x_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.29
docker ps
mysql -u root -p
docker exec -it x_mysql /bin/bash
mysql -u root -p
// 创建mongo镜像
# 1.拉取 mongodb 镜像
- docker pull mongo:5.0.5
# 2.运行 mongo 镜像
- docker run -d --name x_mongo -p 27017:27017 mongo:5.0.5
# 3.进入 mongo 容器
- docker exec -it x_mongo bash
// 创建jenkins
docker pull jenkins/jenkins
docker run -d -uroot -p 8080:8080 -p 50000:50000 --name=x_jenkins -v /usr/local/volume/jenkins:/var/jenkins_home jenkins/jenkins:latest
#权限
chmod 777 /usr/local/volume/jenkins
**安装node环境**
docker pull node:16.17.1
docker images
docker run -itd --name=x_node node:16.17.1
docker exec -it x_node /bin/bash
node -v
rm -rf node_modules
npm install
if test $env = "test"; then
echo "test"
npm run build:test
else
echo "prod"
npm run build:prod
docker cp dcfbb8e0e6e0:/var/jenkins_home/workspace/vite-tsx/dist/* /usr/local/volume/nginx/html/
cp -r /usr/local/volume/jenkins/workspace/vite-tsx/dist/* /usr/local/volume/nginx/html/
linux 文件传输命令
在本机的终端上输入以下命令进行安装
sudo apt-get install ssh
安装成功后, 利用SSH 远程登录 Ubuntu服务器
在终端输入以下命令:
ssh username@192.168.0.1
其中,username是服务器的名称, 192.168.0.1是服务器的IP地址。
将文件/文件夹从远程 Ubuntu 机拷至本地(scp)
scp -r username@192.168.0.1:/home/username/remotefile.txt
scp root@192.168.0.1:/usr/local/volume/nginx/html/remotefile.txt .
其中,
1)scp是命令,-r是参数
2)username是服务器账号
3)192.168.0.1是要上传的服务器ip地址
4)/home/username/remotefile.txt是需要拷到本机的文件
将文件/文件夹从本地拷至远程 Ubuntu 服务器
scp -r localfile.txt username@192.168.0.1:/home/username/
scp index.html root@192.168.0.1:/usr/local/volume/nginx/html
其中,
1)scp是命令,-r是参数
2)localfile.txt 是文件的路径和文件名
3)username是服务器账号
4)192.168.0.1是要上传的服务器ip地址
5)/home/username/是要拷入的文件夹路径
Node的Dockerfile配置
# from 构建镜像的基础源镜像 该image镜像文件继承官方的node image
FROM node
# 在容器中创建一个目录
RUN mkdir -p /usr/src/app/
# 定位到容器的工作目录
WORKDIR /usr/src/app/
# RUN/COPY是分层的,package.json 提前,只要没修改就不会重新安装包
COPY package.json /usr/src/app/package.json
RUN cd /usr/src/app/
RUN npm i
# 把当前目录下所有的文件拷贝到 Image 的 /usr/src/app/目录下
COPY . /usr/src/app/
EXPOSE 3000
CMD npm run dev
判断Docker镜像是否存在
if test "$(docker images -q 镜像名:tag 2> /dev/null)" = ""
then
echo '不存在镜像'
else
echo '存在镜像'
fi
或者如下:
if [[ "$(docker images -q [镜像名]:[镜像tag] 2> /dev/null)" != "" ]];
then
xxx
判断Docker容器是否存在
docker inspect 容器名 -f '{{.Name}}' > /dev/null
if [ $? -eq 0 ]
then
echo "存在容器"
else
echo '不存在容器'
fi
或者如下:
if [[ "$(docker inspect [容器名] 2> /dev/null | grep '"Name": "/[容器名]"')" != "" ]];
then
xxx